如何用相应的字典值更改多行csv文件

2024-06-11 09:41:39 发布

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

我的csv文件(“挑战.csv“包含多行,如下所示(列数不同,约8000行):

2937,58462BC9A59FA7D29819028,29,57eb63d813fd7c0329bdb01f

2938,58462BC9A59FA7D29819028,30,57eb63d713fd7c0329bdafb5,57eb63d713fd7c0329bdafb6


我也有 一个名为mydic的字典福特汽车.csv“例如:

{ '58462bc9a559fa7d29819028':'negative chin up', '57eb63d813fd7c0329bdb01f':'knee squeeze squat', '57eb63d713fd7c0329bdafb5: 'squat', '57eb63d713fd7c0329bdafb6':'lunge', ... }

我想将"challenges.csv"的值更改为mydic 如果"challenges.csv"的值等于mydic的键。
我该怎么办?请帮帮我。在


预期输出: 包含以下行的csv文件

2937,'negative chin up',29,'膝盖挤压下蹲'

2938,'下巴负向上',30,'蹲下','弓箭步'

^{pr2}$

Tags: 文件csv字典汽车upchallengesnegative列数
2条回答

最好不要尝试在适当的地方更新值,而是创建一个新的临时文件作为输出。此脚本尝试对所有列值进行字典替换,并将每一行写回新的临时文件。通过使用这种方法,文件可以是任意大小的,而不需要完全加载到内存中:

以下方法应该有效:

import csv
import os

challenges = 'challenges.csv'
temp = '_temp.csv'

with open('forDic.csv', newline='') as f_fordic:
    mydic = {row[0] : row[1] for row in csv.reader(f_fordic)}

with open(challenges, newline='') as f_challenges, open(temp, 'w', newline='') as f_temp:
    csv_temp = csv.writer(f_temp)

    for row in csv.reader(f_challenges):
        csv_temp.writerow([mydic.get(c.strip(), c.strip()) for c in row])

# Rename the temp file back to challenges (optional)
os.remove(challenges)
os.rename(temp, challenges)

为您提供一个更新的challenges.csv文件,如下所示:

^{pr2}$

假设

在香肠.csv在

317, change1, 89, change2, change3
318, change1, 89, change3, change4

在福特汽车.csv在

^{pr2}$

下面的代码只打印被替换的行

import re, csv

with open('fordic.csv', mode='r')as infile:
    reader = csv.reader(infile)
    mydic = dict((rows[0], rows[1]) for rows in reader)
    print(mydic)


mydic = dict((re.escape(k), v) for k, v in mydic.iteritems())
pattern = re.compile("|".join(mydic.keys()))

with open('./challenges.csv', mode='r') as infile:
    lines = infile.readlines()

    for row in lines:
        print pattern.sub(lambda m: mydic[re.escape(m.group(0))], row)

输出

317,  changedto1, 89,  changedto2,  changedto3
318,  changedto1, 89,  changedto3,  changedto4

要理解多字符串替换,请执行以下操作SO Answer

相关问题 更多 >