如何合并CSV文件,以便将具有唯一标识符的行添加到输出的同一行中



我正在使用Python将4个无头CSV合并到一个输出文件中。

每个CSV在第一列中都有一个唯一的编号,如下面的2个示例CSV文件所示:

1.csv

1,Ringo,Beatles
2,John,Beatles
3,Mick,Rolling Stones
4,Keith,Rolling Stones
5,Rivers,Weezer

2.csv

1,TSLA,XNAS,1.0,USD
2,AAPL,XNAS,1.0,USD
3,SPY,ARCX,1.0,USD
4,BP LN,XLON,1.0,GBP
5,ESUD,XCME,1.0,USD

我使用以下代码生成了这些CSV的输出。

import os
import csv
filenames = ['1.csv', '2.csv', '3.csv', '4.csv']
with open('output_file', 'w') as outfile:
for fname in filenames:
with open(fname) as infile:
outfile.write(infile.read())

这可以很好地工作并输出一个文件。数据最终如下

1,Ringo,Beatles
2,John,Beatles
3,Mick,Rolling Stones
4,Keith,Rolling Stones
5,Rivers,Weezer
1,TSLA,XNAS,1.0,USD
2,AAPL,XNAS,1.0,USD
3,SPY,ARCX,1.0,USD
4,BP LN,XLON,1.0,GBP
5,ESUD,XCME,1.0,USD1,5,-600,1043.22,-625932.00
3,5,200,304.89,60978.00
5,4,6,3015.25,904575.005,4,-1,2,3009.50
5,4,1,1,3011.75
4,3,1,1000,308.37
4,3,1,200,309.15
1,3,1,100,309.0125

有没有一种方法可以使用第一个列编号作为"唯一"编号来链接数据,从而获取以"1"开头的三个结果,并将它们添加到同一行?

例如,这些具有相同的"唯一"编号"1":

1,Ringo,Beatles
1,TSLA,XNAS,1.0,USD
1,3,1,100,309.0125

结果行为:

(1) Ringo,Beatles,TSLA,XNAS,1.0,USD,3,1,100,309.0125

您可以使用dictionary将所有数据作为

{
1: [1, "Ringo", "Beatles", 1, "TSLA", "XNAS", 1.0, "USD", 1, 3, 1, 100, 309.0125], 
2: [2, ...],
3: [3, ...],
...
}

然后将所有内容写入新文件。

所以首先创建一个空字典。即new_rows = {}

接下来从文件中获取行,获取ID并检查它是否存在于字典中。如果不存在,则使用只有IDnew_rows[key] = [key]的列表创建

接下来,您可以将行中的其他值添加到此列表new_rows[key] += values

对所有文件中的所有行重复此操作。

稍后,您可以使用此字典将所有行写入新文件。


我只使用io来模拟内存中的文件,但您应该使用open()

text1 = '''1,Ringo,Beatles
2,John,Beatles
3,Mick,Rolling Stones
4,Keith,Rolling Stones
5,Rivers,Weezer'''
text2 = '''1,TSLA,XNAS,1.0,USD
2,AAPL,XNAS,1.0,USD
3,SPY,ARCX,1.0,USD
4,BP LN,XLON,1.0,GBP
5,ESUD,XCME,1.0,USD'''
import os
import csv
import io
new_rows = {} # dict
filenames = [text1, text2]
#filenames = ['1.csv', '2.csv', '3.csv', '4.csv']
for fname in filenames:
#with open(fname) as infile:
with io.StringIO(fname) as infile:
reader = csv.reader(infile)
for row in reader:
key = row[0]      # ID
values = row[1:]  # rest

# create key if not exists
if key not in new_rows:
new_rows[key] = [key]

new_rows[key] += values  # add two lists

# OR
#if key not in new_rows:
#    new_rows[key] = values    # only for first file
#else:
#     new_rows[key] += values  # for other file - add two lists 
# --- write it  ---
with open('output_file', 'w') as outfile:
writer = csv.writer(outfile)
all_rows = new_rows.values()
writer.writerows(all_rows)   # `writerows` with `s` to write list with many rows.

BTW:

在较旧的Python中,dict不必保持顺序,因此可以按不同的顺序写入新行,并且在保存之前需要对行列表进行排序,或者需要使用collections.OrderedDict()

最新更新