我应该根据条件为我的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
文件本身。所以现在我有一个不同的问题。
答案 0 :(得分:8)
您在if row[2] or row[3] or row[4] == '0':
和row[9] == 'Label'
处遇到问题,可以使用any
检查多个等于相同值的变量,并使用=
分配值,我也建议使用with open
。
此外,您无法在csv
文件中同时读取和写入,因此您需要将更改保存到新的csv文件,之后可以删除原始文件并使用{重命名新文件{3}}和os.remove
:
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]))
答案 1 :(得分:4)
您可以写一个tempfile.NamedTemporaryFile,只需使用in
来测试"0"
,因为您匹配的是完整字符串而不是子字符串,因此您不会使用任何字符串来保存任何内容当你创建一个由三个元素组成的元组时,你也可以切片或者只测试成员资格,然后你只需用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]
也是你的文件名和字符串,这就是你需要传递的全部内容。
答案 2 :(得分:0)
我认为问题在于行
w = open(sys.argv[1], 'w')
r = open(sys.argv[1], 'r')
您正在打开相同的文件进行读写。请尝试使用不同的文件名。