2015-09-04 78 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

是的,它是随地吐痰的输出,但它几乎没有爬行,我只有三个输出在多个小时后产生 –