2010-10-21 119 views
3

我有幾個.csv文件(~10),需要將它們水平合併到一個文件中。每個文件具有相同的行數(〜300)和4個標題行,它們不一定相同,但不應合併(僅從第一個.csv文件獲取標題行)。行中的令牌用逗號分隔,兩者之間沒有空格。如何將兩個.csv文件與python水平合併?

作爲一個蟒蛇noob我還沒有想出一個解決方案,但我確信有一個簡單的解決方案來解決這個問題。歡迎任何幫助。

回答

0

你可以通過實踐學習(甚至嘗試)。所以,我會給你一些提示。使用以下功能:

IOBase.readlines()
  • 要根據一系列分裂tokents的分割字符串

    如果你真的不知道該怎麼做,我建議你閱讀the tutorialDive Into Python 3。 (根據您知道多少Python,您必須通讀前幾章或直接轉到文件IO章節。)

  • 0

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

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

    以上將把它們放在水平沒有標題。如果你想標題,只是讓他們從file1

    $ (head -4 file ; paste file[1-4] | awk 'NR>4') > output 
    
    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) 
    
    +0

    也許你會需要合併之前進行切片,然後做這樣的事情,而不是列表理解。 a.extend(b [4:]) – anijhaw 2010-10-21 13:14:24

    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() 
    
    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