如何在写新行时删除旧行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在写新行时删除旧行?相关的知识,希望对你有一定的参考价值。

我有一个程序可以读取2个文件。如果db.csv中的数字大于log.csv中的数字,请将log.csv中的数字替换为较大的数字。否则,什么也不做。

我的代码的问题是较小的数字没有被替换。正在将较大的数字写入文件,但较小的数字将附加到第二行。我希望删除较小的数字。

这是我的代码实际上有效:

import time
import os

def locate():

    while True:

        time.sleep(8)
        try:
            with open("log.csv", "rb") as f:  # Open local log for read
                for number in f:
                    log_number = number
                    with open("db.csv", "rb") as f2:  # Open db for write

                        # Will read database here
                        for first_line in f2:
                            db_number = first_line

                            if db_number > log_number:
                                print ("We have a new winner!")
                                with open("log.csv", "wb") as f:  # Open local log for write
                                    f.write(db_number)
                                    break
                            else:
                                print ("Number is the same.")
                                break
        except OSError as e:
            print (e)
            break

locate()

当我尝试将open(“log.csv”)保持为1行时,我的问题就出现了。例如:

import time
import os

def locate():

    while True:

        time.sleep(8)
        try:
            with open("log.csv", "rb+") as f:  # Open local log for read
                for number in f:
                    log_number = number
                    with open("db.csv", "rb") as f2:  # Open db for write

                        # Will read database here
                        for first_line in f2:
                            db_number = first_line

                            if db_number > log_number:
                                print ("We have a new winner!")
                                f.truncate()  # trying to remove the old number
                                f.write(db_number)

                                break
                            else:
                                print ("Number is the same.")
                                break
        except OSError as e:
            print (e)
            break

locate()

如何从log.csv中正确删除旧的(较小的)号码?

旧号码写入第2行。

答案

如何从log.csv中正确删除旧的(较小的)号码?

在你写完之后,你真的不能。

这不是文件的工作方式!

文件实际上只是一个连续的字节数组。你不能“在中间删除一些”。

您需要做的是复制要删除的行之前和之后的所有行。

truncate()将删除你刚读过的行之后的所有内容(那是文件指针在那一刻的位置)。你需要计算那条线的长度,并做一些像f.truncate(f.tell()-lastlinelength)。但是之后你会失去一切!我真的不认为你想要什么truncate

总而言之,您似乎需要修改几个数字。只需将整个条目列表保存在RAM中,并在读完整个日志后将其写出来并进行处理。

以上是关于如何在写新行时删除旧行?的主要内容,如果未能解决你的问题,请参考以下文章

即使其主键ID号小于输入的较早行,如何使行保持其条目位置

在 Perl 中,如何从文件中删除 ^M?

旧行新列的空白 dynamodb

从 SQLite 中删除旧行

Oracle:更新旧行时创建新行

删除旧行 MySQL 触发器 - 初学者