2015-09-04 4 views
1

У меня есть несколько папок, каждый из которых содержит csvs. Я пытаюсь согласовать csvs в каждом подкаталоге, а затем экспортировать его. В конце я бы имел такое же количество выходов, как и папки. В конце концов, я хотел бы иметь Folder1.csv, Folder2.csv, ... Folder99.csv и т.д. Это то, чтоLooping CSV Concat в Python Pandas

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

Вам нужно для конкатенации имени и имени файла для полного пути к вашим файлам. Измените эту строку следующим образом:

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

Edit:
Я не знаю, как работает панды, потому что я никогда не использовал его. Но я думаю, что ваша проблема в том, что вы определили все, что вы хотели бы сделать, для CSV во внутреннем цикле, который перебирает только файлы (по крайней мере, отступы выглядят так, но это также может быть проблемой формата, которая возникла при вставке ваш код здесь на SO).

я переписал код и исправлены некоторые вещи, которые я думаю, может быть проблема:

  • Во-первых, я переименовал переменные, начинающиеся с большой буквы, потому что,
    для меня, это всегда выглядит странно иметь ВАР с большими стартовыми буквами.
  • я переехал список переменный для внешнего цикла, поскольку она должна быть
    сбрасываться каждый раз при входе в новый каталог, как вы хотите, чтобы все том 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

Да, это плюющие выходы, но его едва ползти, у меня было только три выхода, сгенерированные после нескольких часов. –