使用另一个 csv 文件中的更新信息更新现有的 csv 文件

事情28

我有 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()

zulucsv的内容

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

bommelcsv的内容

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 spark 中的另一个 csv 文件更新 csv 文件

使用 python 将现有 csv 文件中的列插入另一个 csv 文件

使用熊猫确定一个CSV文件中的值是否在另一个CSV文件中丢失

仅将一个 CSV 文件中的两列更新到另一个 CSV 文件

如何使用python将一个csv文件附加到另一个

如何使用python用逗号分隔文件的值更新现有的csv文件

从csv文件读取特定的列,然后使用python写入另一个CSV

读取 .csv 的内容并使用 python 将其写入另一个 .csv 文件

在另一个 csv 文件中搜索一个 CSV 文件并更新第一个 csv 中的列值

根据来自另一个文件的zip合并更新csv文件中的城市

如何使用 Pentaho 验证一个 csv 数据与另一个 csv 文件的比较?

从另一个csv文件添加列

如何从另一个csv文件添加列

从另一个为CSV文件分配值

从另一个创建CSV文件

检查另一个csv文件中每一行的csv文件值

使用Powershell将CSV文件追加到另一个文件的末尾

如何从csv文件/ Oracle中的另一个表更新大表

读取,更新然后在 java 中创建另一个 csv 文件

如何使用python将某些csv文件列复制到另一个csv文件中?

读取csv文件,并仅在另一个csv文件中添加新条目

在CSV文件中应用diff()函数,然后导出到另一个CSV文件

如何grep csv文件信息并将其放在另一个文件中

如何遍历 csv 文件并根据另一个文件的值更新值

仅基本 bash:通过具有未知架构的主键使用另一个 .csv 文件插入/更新 .csv 文件

Python:使用CSV解析(?)变量,然后将其输出到另一个文件

如何使用来自另一个 .txt 的列表过滤 .csv/.txt 文件

如何根据另一个csv文件替换文件csv的值?

如何根据另一个 .csv 文件删除 .csv 文件的元素?