如何同时读取和修改大型 CSV 文件?

How do i simultaneously read and modify a large CSV file?

提问人:aziz-ashy 提问时间:2/15/2021 最后编辑:aziz-ashy 更新时间:2/15/2021 访问量:164

问:

我有一个大的 csv 文件,我需要以各种方式迭代和修改。它太大了,我无法加载到内存中。

在下面的代码中,我试图做的是从我的数据中删除第 4 列。

import os
import csv

DIR_PATH = os.path.abspath(os.path.dirname(__file__))
FILE_NAME = "file-name"
DELIMITER = ";"
POINTER = 0

#Generator function that yields individual rows.
def get_row(csvfile, delimiter):
        datareader = csv.reader(csvfile,delimiter=delimiter)
        global POINTER
        POINTER = csvfile.tell() #Initial position before any rows processed
        for row in datareader:
            yield row 
            csvfile.seek(POINTER)
        
        

if __name__ == "__main__":
    csvfile = open(os.path.join(DIR_PATH, FILE_NAME + ".csv"), 'r+')
    datawriter = csv.writer(csvfile, delimiter = DELIMITER, quotechar = '"', quoting=csv.QUOTE_MINIMAL)
    count = 0
    for row in get_row(csvfile,DELIMITER):
        #Write every entry except row[4] 
    
        csvfile.seek(POINTER)
  
        datawriter.writerow(tuple(row[ii] for ii in range(len(row)) if ii != 4))
        
        POINTER = csvfile.tell()
    

    csvfile.close()

我的输出如下所示:

标题行写得很好。

然后,它再次打印标题行的最后几个字符,但在自己的行中。

然后,第一个条目缺少第一个字符。

然后其他一切都很好,并且按预期运行。

看起来像这样:

Header 1; Header 2; Header 3; Header 4; Header 5
4; Header 5
Ata 1; Data 2; Data 3; Data 4; Data 5;
Data 1; Data 2; Data 3; Data 4; Data 5;
Data 1; Data 2; Data 3; Data 4; Data 5;
...

我不明白为什么会出错。我明确标记了阅读和写作的位置。

谢谢。

python-3.x csv 文件 io

评论

2赞 ritesh 2/15/2021
您可以使用临时文件写入数据,而不会覆盖原始文件。在脚本的末尾,您可以将临时文件作为原始文件移动。
0赞 C.Nivs 2/15/2021
我有点惊讶你的,并没有把你扔进一个无限循环fh.tellfh.seek
0赞 aziz-ashy 2/15/2021
@Ritesh 同时存在的临时文件和主文件会占用太多空间。设备将耗尽内存(存储空间)。
2赞 Serge Ballesta 2/15/2021
CSV 文件是文本文件。重写文本文件是一项非常危险的操作。只有当新行比初始行短时才有意义(这里可以),并且需要保留 2 个文件指针,一个用于读取,一个用于写入,并在读取和写入操作之间始终添加查找。写入临时文件并在最后重命名要简单得多。
0赞 Martin Evans 2/16/2021
您应该有足够的磁盘空间来复制文件?内存应该不是问题,因为这可以一次处理一行。读取一行,对其进行处理,将其写入 temp。如果速度太慢,您将在内存中读取 1000 行,处理它们并写入 1000 行。不应尝试就地重写文件。

答: 暂无答案