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]
也是你的文件名和一个字符串,所以这就是你需要传递的全部内容。
我应该根据条件向我的 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]
也是你的文件名和一个字符串,所以这就是你需要传递的全部内容。