我有几个.csv文件(~10),需要将它们水平合并到一个文件中。每个文件具有相同的行数(~300)和4个标题行,这些标题行不一定相同,但不应合并(仅从第一个.csv文件中获取标题行)。行中的标记以逗号分隔,中间没有空格。
作为一个python noob,我没有提出解决方案,但我确信这个问题有一个简单的解决方案。欢迎任何帮助。
答案 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)
你从实践中学习(甚至尝试)。所以,我只是给你一些提示。使用以下功能:
open()
IOBase.readlines()
str.split()
如果您确实不知道该怎么做,我建议您阅读the tutorial和Dive 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()