python - 将 2 个 csv 文件与一个唯一列但不同的标题合并

标签 python bash csv

我想使用某种脚本语言(如 bash 脚本或 python)合并 2 个 csv 文件。

1st.csv(此数据来自mysql查询)

member_id,name,email,desc
03141,ej,ej@domain.com,cool
00002,jes,jes@domain.com,good
00002,charmie,charm@domain.com,sweet

2nd.csv(来自 mongodb 查询)

id,address,create_date
00002,someCity,20150825
00003,newCity,20140102
11111,,20150808

这些例子不是实际的,尽管我知道 qsl 中的一些 member_id 和 mongodb 中的 id 是相同的。 (*我希望我的输出是这样的)

所需输出.csv

meber_id,name,email,desc,address,create_date
03141,ej,ej@domain.com,cool,,
00002,jes,jes@domain.com,good,someCity,20150825
00002,charmie,charm@domain.com,sweet,
11111,,,,20150808

我们将非常感谢您的帮助。提前致谢

#########################################################################

#!/usr/bin/python
import csv
import itertools as IT

filenames = ['1st.csv', '2nd.csv']
handles = [open(filename, 'rb') for filename in filenames]
readers = [csv.reader(f, delimiter=',') for f in handles]

with  open('desiredoutput.csv', 'wb') as h:
    writer = csv.writer(h, delimiter=',', lineterminator='\n', )
    for rows in IT.izip_longest(*readers, fillvalue=['']*2):
        combined_row = []
        for row in rows:
            row = row[:1] # column where 1 know there are identical data
            if len(row) == 1:
                combined_row.extend(row)
            else:
                combined_row.extend(['']*1)
        writer.writerow(combined_row)

for f in handles:
    f.close()

#########################################################################

刚刚在这个网站上阅读并尝试了这段代码(操作)

最佳答案

由于您尚未发布尝试,我将为您提供一个一般性答案(使用 Python)来帮助您入门。

  • 创建一个dictd
  • 迭代第一个文件的所有行,将每一行转换为一个列表,并将其存储在 d 中,使用 meber_id 作为键,列表作为值。
  • 迭代第二个文件的所有行,将每行转换为一个列表,保留 id 列,并使用新的列更新 d[id] 下的列表如果d[id]存在则列出,否则将新列表存储在d[id]下。
  • 最后,迭代 d 中的值并将它们打印出来(以逗号分隔)到文件中。

编辑

在您的尝试中,您尝试使用 izip_longest 同时迭代两个文件的行。但只有当两个文件中的行数相同且顺序相同时,此方法才有效。

无论如何,这是一种方法。

注意:这是使用 Python 3.4+ csv 模块。对于 2.7,它可能看起来有点不同。

import csv

d = {}

with open("file1.csv", newline="") as f:
  for row in csv.reader(f):
    d.setdefault(row[0], []).append(row + [""] * 3)

with open("file2.csv", newline="") as f:
  for row in csv.reader(f):
    old_row = d.setdefault(row[0][0], [row[0], "", "", ""])
    old_row[4:] = row[1:]

with open("out.csv", "w", newline="") as f:
  writer = csv.writer(f)
  for rows in d.values():
    writer.writerows(rows)

关于python - 将 2 个 csv 文件与一个唯一列但不同的标题合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32216423/

相关文章:

用于 INSERT 或 UPDATE(不仅仅是 INSERT)的 Python PostgreSQL COPY 命令

linux - Bash 模式匹配

从另一个完成 Bash 完成

python - AWS Glue,输出一个带分区的文件

java - 将数据存储在平面文件中

python - Pandas:根据条件求和字符串

Python系列,其中值是列表,获取另一个系列,其索引列表对应于每个项目列表

bash - Mac OS 上 Automator 应用程序 (.app) 的百分比进度

javascript - 将 CSV 数据解析为 JS 对象以在图表中使用。 Uncaught ReferenceError : data is not defined(jsfiddle included)

mysql - 使用csv从oracle导入到mysql