CSV 写入文件困难

CSV Writing to File Difficulties

我应该根据条件向我的 CSV 文件添加特定标签。 CSV 文件有 10 列,第三、第四和第五列是对条件影响最大的列,我在第十列上添加了我的标签。我这里的代码以无限循环结束:

import csv
import sys

w = open(sys.argv[1], 'w')
r = open(sys.argv[1], 'r')

reader = csv.reader(r)
writer = csv.writer(w)

for row in reader:
    if row[2] or row[3] or row[4] == '0':
        row[9] == 'Label'
        writer.writerow(row)

w.close()
r.close()

不知道为什么会死循环

编辑:我犯了一个错误,我原来的无限循环程序有这一行:

w = open(sys.argv[1], 'a')

我将 'a' 更改为 'w',但这最终会擦除整个 CSV 文件本身。所以现在我有一个不同的问题。

我认为问题出在行

w = open(sys.argv[1], 'w')
r = open(sys.argv[1], 'r')

您正在打开同一个文件进行阅读,writing.So尝试使用不同的文件名。

你在这里 if row[2] or row[3] or row[4] == '0': 和这里 row[9] == 'Label' 有问题,你可以使用 any to check several variables equal to the same value, and use = to assign a value, also i would recommend to use with open

另外在csv文件中不能同时读写,所以需要将修改保存到一个新的csv文件中,之后可以删除原来的文件,重命名新的文件使用 os.remove and os.rename:

import csv
import sys    
import os

with open('some_new_file.csv', 'w') as w, open(sys.argv[1], 'r') as r:
    reader, writer = csv.reader(r), csv.writer(w)
    for row in reader:
        if any(x == '0' for x in (row[2], row[3], row[4])):
            row[9] = 'Label'
        writer.writerow(row)

os.remove('{}'.format(sys.argv[1]))
os.rename('some_new_file.csv', '{}'.format(sys.argv[1]))

您可以写入 tempfile.NamedTemporaryFile and just use in to test for the "0" as you are matching a full string not a substring so you won't save anything by using any as you create a tuple of three elements so you may as well slice or just test for membership regardless, then you just replace the original file with shutil.move:

import csv
import sys    
from shutil import move
from tempfile import NamedTemporaryFile

with NamedTemporaryFile("w", dir=".", delete=False) as w, open(sys.argv[1]) as r:
    reader, writer = csv.reader(r), csv.writer(w)
    writer.writerows(row[:-1] + ['Label'] if "0" in row[2:5] else row 
                     for row in reader)

move(w.name, sys.argv[1])

sys.argv[1] 也是你的文件名和一个字符串,所以这就是你需要传递的全部内容。