我有幾個.csv文件(~10),需要將它們水平合併到一個文件中。每個文件具有相同的行數(〜300)和4個標題行,它們不一定相同,但不應合併(僅從第一個.csv文件獲取標題行)。行中的令牌用逗號分隔,兩者之間沒有空格。如何將兩個.csv文件與python水平合併?
作爲一個蟒蛇noob我還沒有想出一個解決方案,但我確信有一個簡單的解決方案來解決這個問題。歡迎任何幫助。
我有幾個.csv文件(~10),需要將它們水平合併到一個文件中。每個文件具有相同的行數(〜300)和4個標題行,它們不一定相同,但不應合併(僅從第一個.csv文件獲取標題行)。行中的令牌用逗號分隔,兩者之間沒有空格。如何將兩個.csv文件與python水平合併?
作爲一個蟒蛇noob我還沒有想出一個解決方案,但我確信有一個簡單的解決方案來解決這個問題。歡迎任何幫助。
你可以通過實踐學習(甚至嘗試)。所以,我會給你一些提示。使用以下功能:
open()
str.split()
IOBase.readlines()
如果你真的不知道該怎麼做,我建議你閱讀the tutorial和Dive Into Python 3。 (根據您知道多少Python,您必須通讀前幾章或直接轉到文件IO章節。)
如果您不一定非要使用Python,則可以使用shell像paste/gawk
等工具
$ paste file1 file2 file3 file4 .. | awk 'NR>4'
以上將把它們放在水平沒有標題。如果你想標題,只是讓他們從file1
$ (head -4 file ; paste file[1-4] | awk 'NR>4') > output
的csv模塊是你的朋友。
您可以使用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)
純粹出於學習目的
一個簡單的方法是不走的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()
你不需要使用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
也許你會需要合併之前進行切片,然後做這樣的事情,而不是列表理解。 a.extend(b [4:]) – anijhaw 2010-10-21 13:14:24