两个如何使用python水平合并几个.csv文件?

时间:2010-10-21 10:12:28

标签: python file csv

我有几个.csv文件(~10),需要将它们水平合并到一个文件中。每个文件具有相同的行数(~300)和4个标题行,这些标题行不一定相同,但不应合并(仅从第一个.csv文件中获取标题行)。行中的标记以逗号分隔,中间没有空格。

作为一个python noob,我没有提出解决方案,但我确信这个问题有一个简单的解决方案。欢迎任何帮助。

6 个答案:

答案 0 :(得分:6)

您可以使用Python中的csv模块加载CSV文件。请参考本模块的documentation获取加载代码,我记不住了,但这很简单。类似的东西:

import csv
reader = csv.reader(open("some.csv", "rb"))
csvContent = list(reader)

之后,当您以这种形式(元组列表)加载CSV文件时:

[ ("header1", "header2", "header3", "header4"),
  ("value01", "value12", "value13", "value14"),
  ("value11", "value12", "value13", "value14"),
  ... 
]

您可以逐行合并两个这样的列表:

result = [a+b for (a,b) in zip(csvList1, csvList2)]

要保存此类结果,您可以使用:

writer = csv.writer(open("some.csv", "wb"))
writer.writerows(result)

答案 1 :(得分:2)

csv模块是你的朋友。

答案 2 :(得分:1)

如果您不一定要使用Python,则可以使用paste/gawk等shell工具

$ paste file1 file2 file3 file4 .. | awk 'NR>4'

上面会将它们水平放置而不带标题。如果您需要标题,只需从file1

获取标题即可
$  ( head -4 file ; paste file[1-4] | awk 'NR>4' ) > output

答案 3 :(得分:1)

您不需要使用csv模块。你可以使用

file1 = open(file1)

打开所有文件后,您可以执行此操作

from itertools import izip_longest

foo=[]
for new_line in izip_longest(file1,fil2,file3....,fillvalue=''):
    foo.append(new_line)

这会给你这个结构(kon已经告诉你了)..如果你在每个文件中有不同的行数,它也会工作

[ ("line10", "line20", "line30", "line40"),
  ("line11", "line21", "line31", "line41"),
  ... 
]

在此之后,您可以将其写入一个一次列出1个列表的新文件

for listx in foo:
    new_file.write(','.join(j for j in listx))

PS:更多关于izip_longest here

的信息

答案 4 :(得分:0)

你从实践中学习(甚至尝试)。所以,我只是给你一些提示。使用以下功能:

如果您确实不知道该怎么做,我建议您阅读the tutorialDive Into Python 3。 (根据你知道多少Python,你要么必须阅读前几章,要么直接切入文件IO章节。)

答案 5 :(得分:0)

纯粹出于学习目的

一种不利用csv模块的简单方法:

# open file to write
file_to_write = open(filename, 'w')
# your list of csv files
csv_files = [file1, file2, ...] 

headers = True
# iterate through your list
for filex in csv_files:
    # mark the lines that are header lines
    header_count = 0
    # open the csv file and read line by line
    filex_f = open(filex, 'r')
    for line in filex_f:
        # write header only once
        if headers:
            file_to_write.write(line+"\n")
            if header_count > 3: headers = False
        # Write all other lines to the file
        if header_count > 3:
            file_to_write.write(line+"\n")
        # count lines
        header_count = header_count + 1
    # close file
    filex_f.close()
file_to_write.close()