我有 2 个 csv 文件,
zulu
具有基本信息,分为列。bommel
仅更新了相同列中相同记录的信息。我想在csv
没有 Pandas 或其他外部资源的Python(使用标准库中的模块)中解决这个问题。
#!/usr/bin/env python3
import csv
# Define column names
fields = ['capcode', 'discipline', 'region', 'location', 'description', 'remark']
# Open the neccesary files
with open('bommel_db_capcodes.txt', 'r') as readFile_bommel:
with open('results.csv', 'w') as results:
with open('zulu_db_capcodes.txt', 'r') as readFile_zulu:
master = csv.DictReader(readFile_zulu, fieldnames=fields)
update = csv.DictReader(readFile_bommel, fieldnames=fields)
writer = csv.DictWriter(results, fieldnames=fields)
# Saves and skips header to output file
writer.writerow(next(master))
# Goes through whole zulu csv
for row in master:
for row2 in update:
if row['capcode'] in update:
writer.writerow(row2)
else:
writer.writerow(row)
ReadFilezulu.close()
ReadFilebommel.close()
results.close()
zulu
csv的内容:
capcode,discipline,region,location,description,remark
000400001,Brandweer,Groningen,Groningen,Regionaal,Pelotonscommandant Logistiek/Water (Noord)
000400002,Brandweer,Groningen,Groningen,,
000400003,Brandweer,Groningen,Groningen,Regionaal,Pelotonscommandant Logistiek/Water) (Oost)
000100000,Brandweer,Amsterdam-Amstelland,Amsterdam-Amstelland,Aalsmeer,Postalarm
000100001,Brandweer,Amsterdam-Amstelland,Amsterdam-Amstelland,,
000100002,Brandweer,Amsterdam-Amstelland,Amsterdam-Amstelland,,Banaanzulu
000100003,Brandweer,Amsterdam-Amstelland,Amsterdam-Amstelland,,
bommel
csv的内容:
capcode,discipline,region,location,description,remark
000100000,Brandweer,Amsterdam-Amstelland,,banaanProefalarm,
000100001,Brandweer,Amsterdam-Amstelland,Aalsmeer,Bevelvoerders,
000100004,Brandweer,Amsterdam-Amstelland,Aalsmeer,Korpsalarm,
当前结果
capcode,discipline,region,location,description,remark
000400001,Brandweer,Groningen,Groningen,Regionaal,Pelotonscommandant Logistiek/Water (Noord)
000400001,Brandweer,Groningen,Groningen,Regionaal,Pelotonscommandant Logistiek/Water (Noord)
000400001,Brandweer,Groningen,Groningen,Regionaal,Pelotonscommandant Logistiek/Water (Noord)
预期结果
capcode,discipline,region,location,description,remark < from saving header
000400001,Brandweer,Groningen,Groningen,Regionaal,Pelotonscommandant Logistiek/Water (Noord) < from zulu
000400002,Brandweer,Groningen,Groningen,, < from zulu
000400003,Brandweer,Groningen,Groningen,Regionaal,Pelotonscommandant Logistiek/Water) (Oost) < from zulu
000100000,Brandweer,Amsterdam-Amstelland,,banaanProefalarm, < from bommel
000100001,Brandweer,Amsterdam-Amstelland,Aalsmeer,Bevelvoerders, < from bommel
000100002,Brandweer,Amsterdam-Amstelland,Amsterdam-Amstelland,,Banaanzulu < from zulu
000100003,Brandweer,Amsterdam-Amstelland,Amsterdam-Amstelland,, < from zulu
000100004,Brandweer,Amsterdam-Amstelland,Aalsmeer,Korpsalarm, < from bommel
关于如何完成这项工作的任何想法?
第一次使用条件时,in update
您会使用整个输入文件。因为update
基本上是一个生成器,当你循环它时就会耗尽它。
此外,您的条件检查更新文件中是否存在完全相同的行,当然它不存在(如果数据完全相同,您将不希望或不需要更新任何内容)。
您想将更新行一次读入内存,然后在看到具有相同键的行(不是整行!)时从主文件中跳过这些行。
我认为第一个字段 ( capcode
) 是这里的关键,尽管可能还有其他安排。
切线地,您可以组合所有with
语句;当你使用时with open
,不需要.close()
任何东西。
#!/usr/bin/env python3
import csv
fields = ['capcode', 'discipline', 'region', 'location', 'description', 'remark']
with open('bommel_db_capcodes.txt', 'r') as readFile_bommel, \
open('results.csv', 'w') as results, \
open('zulu_db_capcodes.txt', 'r') as readFile_zulu:
master = csv.DictReader(readFile_zulu, fieldnames=fields)
update = csv.DictReader(readFile_bommel, fieldnames=fields)
writer = csv.DictWriter(results, fieldnames=fields)
# Save header to output file and skip
writer.writerow(next(master))
# Skip header from updates
next(update)
# Read, remember, and write updated lines
seen = set()
for row in update:
writer.writerow(row)
seen.add(row['capcode'])
for row in master:
if row['capcode'] not in seen:
writer.writerow(row)
演示:https : //ideone.com/7Aj1PQ
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句