2015-09-04 77 views
1

我有多個文件夾,每個文件夾都包含csvs。我試圖在每個子目錄中連接csvs,然後導出它。最後,我將擁有與文件夾相同數量的輸出。最後我想有Folder1.csv,Folder2.csv,... Folder99.csv等等,這是什麼在Python中循環CSV Concat熊貓

import os 
from glob import glob 
import pandas as pd 
import numpy as np 



rootDir = 'D:/Data' 
OutDirectory = 'D:/OutPut' 
os.chdir(rootDir) 

# The directory has folders as follows 
# D:/Data/Folder1 
# D:/Data/Folder2 
# D:/Data/Folder3 
# .... 
# ..... 
# D:/Data/Folder99 

# Each folders (Folder1, Folder2,..etc.) has many csvs. 

frame = pd.DataFrame() 
list_ = [] 
for (dirname, dirs, files) in os.walk(rootDir): 
for filename in files: 
    if filename.endswith('.csv'): 
     df = pd.read_csv(filename,index_col=None, na_values=['-999'], delim_whitespace= True, header = 0, skiprows = 2) 
     OutFile = '%s.csv' % OutputFname 
     list_.append(df) 
     frame = pd.concat(list_) 

     df.to_csv(OutDirectory+OutFile, sep = ',', header= True) 

我收到以下錯誤:

IOError: File file200150101.csv does not exist 

回答

1

您需要將dirname和文件名連接到文件的完整路徑。改變這一行,像這樣:

df = pd.read_csv(os.path.join(dirname, filename) ,index_col=None, na_values=['-999'], delim_whitespace= True, header = 0, skiprows = 2) 

編輯:
我不知道大熊貓是如何工作的,因爲我從來沒有使用過。但是我認爲你的問題在於,你在內部循環中定義了你想要完成的所有事情,這些循環僅在文件上循環(至少縮進看起來是這樣 - 但這也可能是粘貼時發生的格式問題你的代碼在這裏)。

我改寫了你的代碼,並修正了一些事情,我想可能是這個問題:

  • 首先,我改名爲您的變量與大字母開始,因爲
    對我來說,它總是看起來怪怪有瓦爾用大寫字母開頭。
  • 我搬到你的列表變量外循環,因爲它應該是
    ,你希望所有的CSV爲每文件夾 合併重置每次進入新目錄時。
  • 最後,我修復了縮進。在python縮進中告訴 編譯器哪些命令位於內部或外部循環中。

我的代碼現在看起來像這樣。您可能需要改變一些事情,因爲我現在不能測試:

import os 
from glob import glob 
import pandas as pd 
import numpy as np 



rootDir = 'D:/Data' 
outDir = 'D:/OutPut' 
os.chdir(rootDir) 
dirs = os.listdir(rootDir) 

frame = pd.DataFrame() 
for dirname in dirs: 
    # the outer loop loops over directories! the actual directory is stored in dirname 
    list = [] # collect csv data for every directory, not in general 
    files = glob('%s/*.csv' % (dirname)) 
    for filename in files: 
    # the inner loop loops over the files in the 'dirname' folder 
    df = pd.read_csv(filename,index_col=None, na_values=['-999'], delim_whitespace= True, header = 0, skiprows = 2) 
    # all csv data should be in 'list' now 
    outFile = '%s.csv' % dirname # define the name for output csv 
    list.append(df) # do that for every file 
    # at this point, all files in the actual directory were processed 

frame = pd.concat(list_) # and then merge CSVs 
# ...actually not sure how pd.concat works, but i guess it does merge the data 
frame.to_csv(os.path.join(outDir, outFile), sep = ',', header= True) # save the data 
+0

當我手動它在相當短的時間內完成時間執行代碼的文件夾,現在它正在頗有幾分與循環的時間。它還在每個csv中逐行添加輸出。我沒有在上面的代碼中進行計算,但涉及到一些重新採樣。 –

+0

你是否嘗試過用'print(os.path.join(dirname,filename))'列出循環處理的文件以檢查循環是否實際到達它們?如果是這樣,這可能是熊貓的一個問題。 – wullxz

+0

是的,它是隨地吐痰的輸出,但它幾乎沒有爬行,我只有三個輸出在多個小時後產生 –