簡體   English   中英

將多個csv文件合並到一個csv文件中

[英]Combining multiple csv files into one csv file

我試圖將多個csv文件合並為一個,並嘗試了許多方法,但我正在努力。

我從多個csv文件導入數據,當我將它們一起編譯成一個csv文件時,似乎前幾行很好地填充,但隨后它開始隨機輸入行之間的可變數字空格,它從不完成填寫組合的csv文件,它似乎不斷地添加信息,這對我沒有意義,因為我正在嘗試編譯有限數量的數據。

我已經嘗試為該文件編寫close語句,我仍然得到相同的結果,我指定的組合csv文件永遠不會停止獲取數據,它會隨機分配整個文件中的數據 - 我只想要一個正常編譯的csv。

我的代碼中有錯誤嗎? 有沒有解釋為什么我的csv文件這樣做?

csv_file_list = glob.glob(Dir + '/*.csv') #returns the file list
print (csv_file_list)
with open(Avg_Dir + '.csv','w') as f:
    wf = csv.writer(f, delimiter = ',')
    print (f)
    for files in csv_file_list:
        rd = csv.reader(open(files,'r'),delimiter = ',')
        for row in rd:
            print (row)
            wf.writerow(row)

你的文件有相同的結構嗎? 他們需要加入以下信息,如果不是不一致的話。 如果它不是變量,則可以映射數據以生成最終文件。

在您的代碼上,它是正確的,但是要合並文件,您可以簡單地使用“cat”命令,以防您使用類Unix操作系統(Linux,MacOS等),但如果您有幾個文件不同的結構,所以是的python將是完美的。 但對於這種情況,您的代碼將需要一些修改。

你的代碼適合我。

或者,您可以按如下方式合並文件:

csv_file_list = glob.glob(Dir + '/*.csv')
with open(Avg_Dir + '.csv','w') as wf:
    for file in csv_file_list:
        with open(file) as rf:
            for line in rf:
                if line.strip(): # if line is not empty
                    if not line.endswith("\n"):
                        line+="\n"
                    wf.write(line)

或者,如果文件不是太大,您可以一次讀取每個文件。 但在這種情況下,所有空行都將復制標題:

csv_file_list = glob.glob(Dir + '/*.csv')
with open(Avg_Dir + '.csv','w') as wf:
    for file in csv_file_list:
        with open(file) as rf:
            wf.write(rf.read().strip()+"\n")

考慮幾個調整:

  1. 使用上下文管理器, with用於讀取和寫入過程兩者。 這樣就不需要close()文件對象,而這些文件對象不會對read對象執行。
  2. 用於跳過線問題:使用兩參數newline=''open()lineterminator="\\n"中參數csv.writer() 查看前者后者的 SO答案。
  3. 使用os.path.join()來正確連接文件夾和文件路徑。 這種方法是不可知的,所以使用前向或反斜杠類型來說明Windows或Unix機器。

調整后的腳本:

import os
import csv, glob

Dir = r"C:\Path\To\Source"
Avg_Dir = r"C:\Path\To\Destination\Output"

csv_file_list = glob.glob(os.path.join(Dir, '*.csv')) # returns the file list
print (csv_file_list)

with open(Avg_Dir + '.csv', 'w', newline='') as f:
    wf = csv.writer(f, lineterminator='\n')

    for files in csv_file_list:
        with open(files, 'r') as r: 
            next(r)                   # SKIP HEADERS
            rr = csv.reader(r)
            for row in rr:
                wf.writerow(row)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM