使用Python的CSV模块覆盖csv文件中的特定行

问题描述 投票:6回答:3

我正在使用Python的csv模块来进行一些csv文件的读取和写入。

我的阅读很好,并且可以附加到csv上,但是我希望能够覆盖csv中的特定行。

供参考,这是我的阅读内容,然后编写代码以附加:

    #reading
    b = open("bottles.csv", "rb")
    bottles = csv.reader(b)
    bottle_list = []
    bottle_list.extend(bottles)
    b.close()

    #appending
    b=open('bottles.csv','a')
    writer = csv.writer(b)
    writer.writerow([bottle,emptyButtonCount,100, img])
    b.close()

而且我在覆盖模式下使用的基本相同(这是不正确的,它只是覆盖了整个csv文件):

    b=open('bottles.csv','wb')
    writer = csv.writer(b)
    writer.writerow([bottle,btlnum,100,img])
    b.close()

在第二种情况下,如何告诉Python我需要覆盖特定的行?我搜索了Gogle和其他stackoverflow帖子都没有用。我以为我有限的编程知识是怪罪而不是Google。

python csv
3个回答
16
投票

我将添加到Steven答案:

import csv

bottle_list = []

# Read all data from the csv file.
with open('a.csv', 'rb') as b:
    bottles = csv.reader(b)
    bottle_list.extend(bottles)

# data to override in the format {line_num_to_override:data_to_write}. 
line_to_override = {1:['e', 'c', 'd'] }

# Write data to the csv file and replace the lines in the line_to_override dict.
with open('a.csv', 'wb') as b:
    writer = csv.writer(b)
    for line, row in enumerate(bottle_list):
         data = line_to_override.get(line, row)
         writer.writerow(data)

3
投票

您不能覆盖CSV文件中的一行。您必须将想要的所有行写入一个新文件,然后将其重命名为原始文件名。

您的使用方式可能比CSV文件更适合数据库。查看sqlite3模块以获取轻量级数据库。


0
投票

我想使用python替换现有csv文件中的每个备用完整行。

© www.soinside.com 2019 - 2024. All rights reserved.