Python 2.7 在Python中循环CSV Concat

Python 2.7 在Python中循环CSV Concat,python-2.7,csv,pandas,Python 2.7,Csv,Pandas,我有多个文件夹,每个文件夹都包含CSV。我试图在每个子目录中连接CSV,然后将其导出。最后,我将拥有与文件夹相同数量的输出。最后,我希望有Folder1.csv,Folder2.csv,…Folder99.csv等。这是什么 import os from glob import glob import pandas as pd import numpy as np rootDir = 'D:/Data' OutDirectory = 'D:/OutPut' os.chdir(rootDir

我有多个文件夹,每个文件夹都包含CSV。我试图在每个子目录中连接CSV,然后将其导出。最后,我将拥有与文件夹相同数量的输出。最后,我希望有Folder1.csv,Folder2.csv,…Folder99.csv等。这是什么

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

您需要连接dirname和filename以获得文件的完整路径。将此行更改为:

df = pd.read_csv(os.path.join(dirname, filename) ,index_col=None, na_values=['-999'], delim_whitespace= True, header = 0, skiprows = 2)
编辑:
我不知道熊猫是怎么工作的,因为我从来没用过它。但我认为您的问题是,您在仅在文件上循环的内部循环中定义了希望对CSV执行的所有操作(至少缩进看起来是这样的-但这也可能是在将代码粘贴到此处时出现的格式问题)

我重新编写了您的代码,并修复了一些我认为可能存在的问题:

  • 首先,我重命名了以大号字母开头的变量,因为,
    对我来说,有大起始字母的VAR看起来总是很奇怪
  • 我将列表变量移到了外部循环,因为它应该是
    每次输入一个新目录时按您希望的方式重置所有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

当我手动执行一个文件夹的代码时,它会在相当短的时间内完成,现在循环需要相当长的时间。它还在每个csv中逐行添加输出。我没有在上面的代码中加入计算,但涉及到一些重采样。您是否尝试使用
打印(os.path.join(dirname,filename))
列出循环处理的文件,以检查循环是否实际到达它们?如果是的话,这可能是熊猫的问题。是的,它吐出了输出,但几乎没有爬行。我在电脑上测试了一个树状程序,在几个小时后只生成了三个输出。我在电脑上测试了一个树状程序,基本上与你测试的代码相同,减去熊猫的东西(从未与熊猫一起工作过),它对我来说工作得完美无缺。也许性能问题是由循环中的panda代码引起的。可能先尝试收集csv记录,然后在循环完成后对其进行concat。我不知道panda,但它看起来像是
frame=pd.concat(_list)
在你的csv记录集合中一次又一次地运行,因为它越来越大。在循环之后尝试这样做。我重写了您的代码并编辑了我认为应该(接近)正确的代码;)