使用 seek(0) 方法修改 csv 文件会创建不需要的重复输出

modifying a csv file creates unwanted duplicate output using seek(0) method

我正在尝试对我的 csv 文件进行以下调整。 - 操作 1 - 插入一列并填充一个变量 - 操作 2 - 删除文件的前 32 行 我尝试用 seek() 方法重置文件位置来实现这一点。

当 运行 时,csv 文件通过操作 1 插入我的列变量。 操作 2 追加一组重复的记录减去 32 条没有插入列的删除。

我想要的是应用于原始数据集的 2 个动作。我在想 seek) 可能不是我需要的。我还应该考虑什么? N.b。数据文件很小

我的代码;

with open(temp_filename, 'r', newline='') as inf, \
    open(local_filename, 'w', newline='') as outf:
    reader = csv.reader(inf)
    writer = csv.writer(outf)
    all = []
    row = next(reader)

# insert column and fill
    for row in (reader):
        all.append([str(ASXCode)] + row)  
    writer.writerows(all)

    inf.seek(0)

# delete first 32 rows 
    for _ in range(32):   # skip first 32 rows
        next(reader)      
    writer.writerows(reader)  # copy the rest

您可以跳过 32 行并且永远不处理它们,没有必要 'delete' 以这种方式从您的输出中处理这些内容。

在将数据复制到另一个文件时添加列:

from itertools import islice

with open(temp_filename, 'r', newline='') as inf, \
        open(local_filename, 'w', newline='') as outf:
    reader = csv.reader(inf)
    writer = csv.writer(outf)
    next(islice(reader, 32, 32), None)  # skip 32 rows

    # write to output file with extra column
    for row in (reader):
        writer.writerow([str(ASXCode)] + row)

如果必须 re-read 文件中的所有数据,您只需要查找,但您很少真的需要这样做。作为跳过的替代方法,您可以从 all 列表中删除 32 个条目,例如,在写入输出 CSV 之前; del all[:32] 会为你做的。

考虑到这些更改旨在就地发生,并且您的文件很小,如何:

with open('test.csv', 'r') as inf:
    reader = csv.reader(inf)
    lines = [[ASXCode] + row for row in list(reader)[32:]]

with open('test.csv', 'w') as outf:
    writer = csv.writer(outf)
    writer.writerows(lines)