CSV写入文件困难

时间:2016-02-12 02:55:18

标签: python python-2.7 csv python-2.x file-writing

我应该根据条件为我的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文件本身。所以现在我有一个不同的问题。

3 个答案:

答案 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')

您正在打开相同的文件进行读写。请尝试使用不同的文件名。