如何将csv文件中的列追加到一个文件?

时间:2018-10-23 18:30:48

标签: python python-3.x csv scripting

我正在用Python编写脚本。我有一堆csv文件,每个文件包含1列。这些文件可能看起来像这样:

FirstFile.csv

First
a
b
c

SecondFile.csv

Second
a2
b2
c2

我希望创建一些结果文件(我们称其为result.csv),

First    Second
a        a2
b        b2
c        c2

如何在python的目录中附加所有csv并附加所有列,这样我就得到了一个看起来像这样的result.csv(当然,还有更多的列)?

4 个答案:

答案 0 :(得分:3)

您可以尝试使用熊猫。

import pandas as pd
result = pd.concat([ pd.read_csv(f) for f in filenames ],axis=1)
result.to_csv("result.csv",index=False)
  1. 创建文件名列表(例如filenames
  2. 导入熊猫
  3. 将concat函数与列表理解一起使用

答案 1 :(得分:1)

您可以使用csv模块:

创建10个文件:

filenames = []
for i in range(10):
    filenames.append(f"file_{i}.txt")
    with open(filenames[-1],"w") as f:
        f.write(f"Header{i}\n")
        for row in range(5):
            f.write(f"text_{i}_{row}\n")

读取所有文件:

data = []
for f in filenames:       # filled when creating files, you can use os.walk to fill yours
    with open(f) as r:
        data.append([x.strip() for x in r])

# data is a list of columns, we need a list of list of columns, so we transpose the data:
transpose = zip(*data)

# write the joined file
import csv
with open("joined.txt","w", newline="") as j:
    w = csv.writer(j)
    w.writerows(transpose)

检查是否还可以:

with open("joined.txt") as j:
    print(j.read())

输出:

Header0,Header1,Header2,Header3,Header4,Header5,Header6,Header7,Header8,Header9
text_0_0,text_1_0,text_2_0,text_3_0,text_4_0,text_5_0,text_6_0,text_7_0,text_8_0,text_9_0
text_0_1,text_1_1,text_2_1,text_3_1,text_4_1,text_5_1,text_6_1,text_7_1,text_8_1,text_9_1
text_0_2,text_1_2,text_2_2,text_3_2,text_4_2,text_5_2,text_6_2,text_7_2,text_8_2,text_9_2
text_0_3,text_1_3,text_2_3,text_3_3,text_4_3,text_5_3,text_6_3,text_7_3,text_8_3,text_9_3
text_0_4,text_1_4,text_2_4,text_3_4,text_4_4,text_5_4,text_6_4,text_7_4,text_8_4,text_9_4

data看起来像这样:

[['Header0', 'text_0_0', 'text_0_1', 'text_0_2', 'text_0_3', 'text_0_4'], # one files data
 ['Header1', 'text_1_0', 'text_1_1', 'text_1_2', 'text_1_3', 'text_1_4'], 
 ['Header2', 'text_2_0', 'text_2_1', 'text_2_2', 'text_2_3', 'text_2_4'], 
 ['Header3', 'text_3_0', 'text_3_1', 'text_3_2', 'text_3_3', 'text_3_4'], 
 ['Header4', 'text_4_0', 'text_4_1', 'text_4_2', 'text_4_3', 'text_4_4'], 
 ['Header5', 'text_5_0', 'text_5_1', 'text_5_2', 'text_5_3', 'text_5_4'], 
 ['Header6', 'text_6_0', 'text_6_1', 'text_6_2', 'text_6_3', 'text_6_4'], 
 ['Header7', 'text_7_0', 'text_7_1', 'text_7_2', 'text_7_3', 'text_7_4'], 
 ['Header8', 'text_8_0', 'text_8_1', 'text_8_2', 'text_8_3', 'text_8_4'], 
 ['Header9', 'text_9_0', 'text_9_1', 'text_9_2', 'text_9_3', 'text_9_4']]

转置后的样子:

[('Header0', 'Header1', 'Header2', 'Header3', 'Header4', 'Header5', 'Header6', 'Header7', 'Header8', 'Header9'), 
 ('text_0_0', 'text_1_0', 'text_2_0', 'text_3_0', 'text_4_0', 'text_5_0', 'text_6_0', 'text_7_0', 'text_8_0', 'text_9_0'), 
 ('text_0_1', 'text_1_1', 'text_2_1', 'text_3_1', 'text_4_1', 'text_5_1', 'text_6_1', 'text_7_1', 'text_8_1', 'text_9_1'), 
 ('text_0_2', 'text_1_2', 'text_2_2', 'text_3_2', 'text_4_2', 'text_5_2', 'text_6_2', 'text_7_2', 'text_8_2', 'text_9_2'), 
 ('text_0_3', 'text_1_3', 'text_2_3', 'text_3_3', 'text_4_3', 'text_5_3', 'text_6_3', 'text_7_3', 'text_8_3', 'text_9_3'), 
 ('text_0_4', 'text_1_4', 'text_2_4', 'text_3_4', 'text_4_4', 'text_5_4', 'text_6_4', 'text_7_4', 'text_8_4', 'text_9_4')]

答案 2 :(得分:0)

我敢肯定还有更多的pythonic方式,但这是可行的(只要所有文件的行数都相同)。

input_files = ['FirstFile.csv', 'SecondFile.csv']
csv_separator = '\t'

data = []

for file in input_files:
    partial_data = []
    with open(file, 'r') as f:
        for line in f:
            partial_data.append(line.strip('\n'))
        data.append(partial_data)

with open('output.csv','w') as output:
    for item in range(len(data[0])):
        line = []
        for part in range(len(data)):
            line.append(data[part][item])
        output.write(csv_separator.join(line)+'\n')

答案 3 :(得分:0)

如果您正在寻找纯Python解决方案,最好使用csv.DictReadercsv.DictWriter,这样您就可以更好地控制数据的格式。而且,所有内容都是动态生成的,因此对于非常大的文件,它将提高内存效率。

import csv

with open('csv1.csv') as csv1, open('csv2.csv') as csv2:
    r1 = csv.DictReader(csv1)
    r2 = csv.DictReader(csv2)
    with open('csv3.csv', 'w') as csv3:
        writer = csv.DictWriter(csv3, 
            fieldnames=["First", "Second"],
            lineterminator='\n'
        )
        writer.writeheader()
        writer.writerows({**x, **y} for x, y in zip(r1, r2))