如果新行具有相同的主键,如何使用python覆盖csv中的行

2024-09-28 01:30:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我喜欢:

Rollno     Name     score
  20      Akshay     33
  21      Sanjay     32

必须添加的新行:

newrow=[21,'sanjay',33]

结果可能是:

Rollno      Name    score
  20       Akshay    33
  21       Sanjay    33

Tags: namescorenewrowakshayrollnosanjay
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。文件的新条目将添加到dict中。如果新条目包括主键,则现有行将被覆盖,如果该键不存在,则创建新行。如果未提供主键,则计算新键

我会像这样使用dict而不是list

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))

相关问题 更多 >

    热门问题