关联来自两个CSV的数据,并使用Python将数据写入第一个CSV

关联来自两个CSV的数据,并使用Python将数据写入第一个CSV,python,database,csv,Python,Database,Csv,我很难弄清楚在这个个人项目中应该从哪里着手,我希望这个社区能帮助我创建一个Python脚本来处理这些数据 我有一个CSV文件,其中包含动物救援中喂狗的食物列表,与犬舍编号关联: 源CSV-mealsandtreats.CSV blank_column,Kennel_Number,Species,Food,Meal_ID ,1,Dog,Meal,11.2 ,5,Dog,Meal,45.2 ,3,Dog,Meal,21.4 ,4,Dog,Meal,17 ,2,Dog,Meal,11.2 ,4,Dog

我很难弄清楚在这个个人项目中应该从哪里着手,我希望这个社区能帮助我创建一个Python脚本来处理这些数据

我有一个CSV文件,其中包含动物救援中喂狗的食物列表,与犬舍编号关联:

源CSV-mealsandtreats.CSV

blank_column,Kennel_Number,Species,Food,Meal_ID
,1,Dog,Meal,11.2
,5,Dog,Meal,45.2
,3,Dog,Meal,21.4
,4,Dog,Meal,17
,2,Dog,Meal,11.2
,4,Dog,Meal,21.4
,6,Dog,Meal,17
,2,Dog,Meal,45.2
我有第二个CSV文件,该文件提供一个键,该键将膳食映射到随餐提供的食物:

主治餐-mealstrotreatskey.csv

Meals_fed,Treats_fed
10.1,2.4
11.2,2.4
13.5,3
15.6,3.2
17,3.2
20.1,5.1
21.4,5.2
35.7,7.7
45.2,7.9
我需要吃每顿饭,例如;删除表1中提供的重复条目,查找相关的treat类型,然后为每次向特定犬舍提供treat时创建单个条目。最终结果应如下所示:

结果CSV-mealsandtreats.CSV

blank_column,Kennel_Number,Species,Food,Meal_ID
,1,Dog,Meal,11.2
,5,Dog,Meal,45.2
,3,Dog,Meal,21.4
,4,Dog,Meal,17
,2,Dog,Meal,11.2
,4,Dog,Meal,21.4
,6,Dog,Meal,17
,2,Dog,Meal,45.2
,1,Dog,Treat,2.4
,5,Dog,Treat,7.9
,3,Dog,Treat,5.2
,4,Dog,Treat,3.2
,1,Dog,Treat,2.4
,4,Dog,Treat,5.2
我更喜欢使用csv模块,而不是熊猫,但如果必要,我愿意使用熊猫

到目前为止,我刚打开CSV就有了一些代码,但我真的被困在下一步的方向上:

import csv

with open('./meals/results/foodToTreats.csv', 'r') as t1, 
open('./results/food.csv', 'r') as t2:
    key = t1.readlines()
    map = t2.readlines()

with open('./results/food.csv', 'w') as outFileF:
        for line in map:
            if line not in key:
                outFileF.write(line)

with open('./results/foodandtreats.csv', 'w') as outFileFT:
        for line in map:
            if line not in key:
                outFileFT.write(line)
所以基本上我只需要在第二张纸上记下每一个食物条目,在第一张纸上搜索匹配的相关食物条目,查找与该条目相关的犬舍编号,然后将其写在第一张纸上

这是我在伪代码方面的最佳尝试,比如:

for x in column 0,y: 
    y,1 = Z 

food = x
treat = y
kennel_number = z

when x,z: 
    writerows('', {'kennel_number"}, 'species', '{food/treat}',  
{'meal_id"})
更新:这是我使用的确切代码,感谢@wwii。看到一个小错误:

import csv
import collections

treats = {}
with open('mealsToTreatsKey.csv') as f2:
    for line in f2:
        meal,treat = line.strip().split(',')
        treats[meal] = treat

new_items = set()
Treat = collections.namedtuple('Treat', ['blank_column','Kennel_Number','Species','Food','Meal_ID'])

with open('foodandtreats.csv') as f1:
    reader = csv.DictReader(f1)
    for row in reader:
        row['Food'] = 'Treat'
        row['Meal_ID'] = treats[row['Meal_ID']]
        new_items.add(Treat(**row))
    fieldnames = reader.fieldnames

with open('foodandtreats.csv', 'a') as f1:
    writer = csv.DictWriter(f1, fieldnames)
    for row in new_items:
        writer.writerow(row._asdict())
除了一个小错误外,这一切都很正常。写入的第一个新行不是从它自己的行开始的:

制作一本字典,将膳食与食物对应起来

treats = {}
with open(treatfile) as f2:
    for line in f2:
        meal,treat = line.strip().split(',')
        treats[meal] = treat
迭代MEIN文件并创建一组新条目。对新项目使用namedtuples

import collections
new_items = set()
Treat = collections.namedtuple('Treat', ['blank_column','Kennel_Number','Species','Food','Meal_ID'])

with open(mealfile) as f1:
    reader = csv.DictReader(f1)
    for row in reader:
        row['Food'] = 'Treat'
        row['Meal_ID'] = treats[row['Meal_ID']]
        new_items.add(Treat(**row))
    fieldnames = reader.fieldnames
再次打开膳食文件进行追加,并写入新条目

with open(mealfile, 'a') as f1:
    writer = csv.DictWriter(f1, fieldnames)
    for row in new_items:
        writer.writerow(row._asdict())

如果文件未以换行符结尾,则需要在写入新行之前添加一个换行符。由于您可以控制文件,因此您应该确保文件始终以空行结尾。

如果是个人项目,我强烈建议您使用pandas。读取csv需要2行,删除重复项需要1行,左1行join@user32185好吧,太棒了,你说服了我。关于好的文档有什么建议吗DI可以帮助您提供完整的答案。但是,请首先使用df=pd.read_csv./fends/results/foodottreats.csv'和pandas打开文件,并在此处发布df.to_的输出,您指的是哪些副本?如果一号犬舍获得11.2次进餐,那么应该有多少个进餐条目?@wwii如果一号犬舍获得11.2次进餐,我只需要一个将进餐2.4与一号犬舍关联的结果条目。如果11.2号餐被提供给1号、7号和20号犬舍,我需要为1号、7号和20号犬舍提供2.4份相应的款待。看来我们走对了方向。当我试着运行这段代码时,我得到了一个错误-回溯上一次调用:File foodotreatsmapper.py,第18行,在new_items.addTreat**row TypeError:u new_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。看起来错误是说您试图创建一个名为tuple的Treat,并且您向它传递了一个无效的关键字。您是否像我在解决方案中那样定义了namedtuple?你是否在该定义中拼错了blank_列?可以用你的示例数据/文件确认执行吗?我没有收到错误:@wwii I继续并用我正在使用的代码更新了原始帖子。这几乎和你贴的一模一样。你看到什么错误了吗?谢谢你迄今为止的帮助@二战成功了。我的CSV文件有问题。还有最后一个小bug,我在上面概述了它。否则,脚本似乎工作得很好!