2015-07-11 67 views
0

我有一個包含數百個子文件夾的根目錄。現在我想讀取每個子文件夾中的csv文件,它們的名稱是相同的,比如說study.csvPython在樹目錄中遞歸讀取cvs文件並將兩列中的一列附加到數據框中

讀取csv文件後,我想創建一個數據幀來存儲來自這些csv的部分數據文件。新的數據框將包含3列。一個是我們新創建的用於標記csv文件ID的列,另外兩列是兩個csv文件列。

例如: 原始CSV文件的結構是:

row1.... 
row2.... 
row3.... 
row4: column1 column2 column3 column14 column5 
row5: 1  2  3   4  5 
row6: 2  4  2   1  10 
row7: 3  8  9  11  23 
... 

預期的數據幀我想:

New column  column3  column4 
1     3    4 
1     2    1 
1     2    1 
1     9    11 

因此,我們將讀取CSV文件,從開始第4行,對於此數據框中的新列,如果行來自相同的csv文件,則值將相同。我們可以將這個新列作爲csv文件ID。

我發現os.walk可以幫助我遍歷樹目錄,但是我怎樣才能讀取csv中的兩個特定列,同時相應地創建一個新的列?

+0

看看[numpy](http://www.numpy.org/)和[csv](https://docs.python.org/3/library/csv.html)。 – tomasyany

回答

0

遍歷在一個根目錄(包括子文件夾)每個CSV文件,迭代os.walk()並檢查.csv文件擴展的每個文件,然後傳遞路徑和文件名到每個process_file()

for root, dirs, files in os.walk(root_dir): 
    for fi in files: 
     if fi.split(".")[-1] == 'csv': 
      process_file(root + fi) 

負載然後可以將每行中的值與string.split()分開。

每個值現在可以通過它的行數和列數引用像csv_file[row_num][col_num]

要處理一個單一的文件,你可以重複使用任何值row_numcol_num你想:

def process_file(filename): 
    title_line = 3 # indexing starts at 0, so one less than 4 
    cols_to_keep = [0, 2, 3] 

    # load entire CSV file into list (not good for massive files) 
    f_lines = open(filename).readlines() 
    out_file = open("out.csv", "w") 

    f_lines = [line.strip().split(",") for line in f_lines] # split each line in f_lines 
    if os.stat("file").st_size == 0: # if file is empty, add title line 
     out_file.write(",".join(f_lines[title_line])) 
    for line in f_lines[title_line:]: # for each line after title line 
     new_line = [] 
     for col_index in cols_to_keep: 
      new_line.append(line[col_index]) 
     out_file.write(",".join(new_line)) 
+0

非常感謝。看來這個解決方案是針對單個CSV文件的。如何讀取根目錄下多個文件夾中的一批csv文件? –

+0

@YeXu剛剛更新了答案 – bobsterman

+0

建議使用知道如何處理轉義和不同分隔字符的CSV模塊。 –

0

csv模塊專爲這種情況而設計。您可能需要去掉前三行,然後使用第四行來獲取標題,儘管看起來您可以使用位置索引。

然後,您應該能夠編寫一個生成器以傳入數據框。

相關問題