(有效地)使用Python覆盖.csv文件中的特定单元格

时间:2014-08-04 20:56:08

标签: python csv

在伪代码中:我需要一个可以访问.csv文件的代码块,转到n行,n是1,100之间的预定随机数,转到第n行的第3列,并将'FALSE'字符串替换为显示为'TRUE'的字符串。

到目前为止,SO告诉我的是:我可能需要读取文件,将其写入新文件,然后重命名回原始文件名(?)以使其正常工作。

这是我到目前为止的代码:

rnum = randint(1,100)
file1 = open('file.csv', 'rb') 
reader = csv.reader(file1)
file2 = open('file11.csv', 'wb')
writer = csv.writer(file2)
for i, row in enumerate(reader):
    if i == rnum:
        row[2] = 'TRUE'
writer.writerow(row)
file1.close()
file2.close()

代码不起作用 - 在file1.csv文件中,所有打印的内容都是原始.csv文件的最后一行,这不是我想要的。

我认为理想情况下整个file.csv文件应该转移到file1.csv,但是如上所述修改了n行。思考?

很抱歉,如果这是一个显而易见的问题,我就开始编程。

关于此主题的相关SO问题:
Change specific value in CSV file via Python
Writing to a particular cell using csv module in python - 这个问题建议为这个问题创建一个函数?
read and write on same csv file

2 个答案:

答案 0 :(得分:1)

你快到了。注意你在循环中做了什么以及你在写什么。你有这个:

for i, row in enumerate(reader):
    if i == rnum:
        row[2] = 'TRUE'
writer.writerow(row)

我相信你想要做的是枚举文件的行并将它们复制到你正在写入的文件中。除了枚举的最后一行之外,你实际上并没有写任何东西,因为你的写入不在循环中,它在外面。确保它是循环的一部分。

for i, row in enumerate(reader):
    if i == rnum:
        row[2] = 'TRUE'
    writer.writerow(row)

另外,最好使用with语句打开文件。它将帮助您管理文件,因此您不必在最后关闭它,它将为您照顾。

rnum = randint(1,100)
with open('file.csv', 'rb') as file1, open('file11.csv', 'wb') as file2:
    reader = csv.reader(file1)
    writer = csv.writer(file2)
    for i, row in enumerate(reader):
        if i == rnum:
            row[2] = 'TRUE'
        writer.writerow(row)

答案 1 :(得分:0)

执行此操作的最佳方法是只有一个文件。它将节省您浪费内存并担心如何更改文件名。如果使用write命令打开文件,则文件内容将被清空。

我已经快速写了这篇文章,但现在我无法保证它的工作原理,但它的顺序是正确的。

import csv
def OpenFile(fname):
    with open(fname,'r') as f:
        reader = csv.reader(f)
        file = []
        for row in reader:
            file.append(row)
    return file

def WriteFile(fname,data):
    with open(fname,'w') as f:
        writer = csv.writer(f)
        for row in data:
            writer.writerow(row)
rnum = randint(100)
file = OpenFile('file.csv')
file[rnum][2] = 'TRUE'
WriteFile(fname,file)