【问题标题】:How to overwrite a row in csv if new row has same primary key using python如果新行使用python具有相同的主键,如何覆盖csv中的一行
【发布时间】:2020-04-24 13:49:36
【问题描述】:

我有类似的 CSV:

Rollno     Name     score
  20      Akshay     33
  21      Sanjay     32

必须添加的新行:

newrow=[21,'sanjay',33]

生成的 CSV 如下:

Rollno      Name    score
  20       Akshay    33
  21       Sanjay    33

【问题讨论】:

  • Rollno 是主键
  • 你想如何在 csv 中强制执行主键?

标签: python list csv


【解决方案1】:

我会像这样使用字典而不是列表。

d = {
  20: ["Ashay", 33],
  21: ["Sanjay", 32]
}

以及更新时

d[21] = ["Sanjay", 33]

这将完全满足您的需求。

如果您可以选择如何将其保存到磁盘,我会使用 pickle

import pickle

#loading
d = pickle.load(file("filename.pickle"))
#saving
pickle.dump(d,file("filename.pickle","w"))

如果你需要解析 CSV 文件(这里用分号作为分隔符和 Unix 风格的换行符 (\n)),可以这样做

#loading
d = {}
for row in file("filename.csv").readlines():
 row=row.split(";")
 d[int(row[0])] = [row[1],int(row[2])]

#saving
l = []
for x in d:
 l.append(";".join(x,str(d[x][0]),str(d[x][1])))

file("filename.csv","w").write("\n".join(l))

【讨论】:

    【解决方案2】:

    你可以这样做:

    import csv
    
    
    with open('scores.csv', newline='') as f:
        reader = csv.reader(f)
        row_dict = {int(row[0]): row for row in reader}
    
    
    while True:
        print(row_dict)
        raw = input('(id) name score? ')
        if raw in 'Qq':
            break
        new_row = [x.strip() for x in raw.split()]
        if len(new_row) == 3:
            # id provided, so overwrite existing row
            # or create a new one
            row_dict[int(new_row[0])] = new_row
        else:
            # No id provided
            new_id = max(row_dict) + 1 
            new_row.insert(0, new_id)
            row_dict[new_id] = new_row
    
    with open('scores.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        for _, v in sorted(row_dict.items()):
            writer.writerow(v)
    

    这个想法是读取文件并根据行创建一个字典,以主键或 id 为键。文件的新条目被添加到字典中。如果新条目包含主键,则现有行将被覆盖,如果主键不存在,则会创建新行。如果没有提供主键,则会计算一个新键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2022-12-12
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      相关资源
      最近更新 更多