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

时间:2018-03-28 16:45:44

标签: python-3.x file-io

我有一个程序可以读取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()

当我尝试将打开(" 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行。

1 个答案:

答案 0 :(得分:1)

  

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

在你之后写完任何东西之后,你真的无法做到。

这不是文件的工作方式!

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

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

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

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