将大型csv文件块读取到数据帧并使用列标题排序为条件

时间:2016-09-27 15:58:03

标签: python csv pandas dataframe large-files

我使用glob.iglob和read_csv迭代文件夹中的多个.txt文件。数据按月文件排列。目标是提取数据并合并为汇总的月度文件。文件的格式是相关的,但有些不一致(因此下面使用fUniv)。

for filename in glob.iglob('*file.txt'):
    fUniv = open(filename, 'U')
    df = pd.read_csv(fUniv,engine='c',low_memory=False)
    fUniv.close()
    mainBlock(df)

迭代效果很好。在文件中,有两组不同的列标题。我需要使用if-elif-else来区分这两种文件类型,这些文件根据特定列标题的存在来区分文件。

def mainBlock(df):
    if 'x' in df.columns:
        #do stuff
    elif 'y' in df.columns:
        #do different stuff
    else:
        #something is wrong
        sys.exit('Script terminated.')

    #append df to monthly file
    with open(file, 'a') as s:
        frame.to_csv(s, header=True, index_col=1, encoding='utf-8')

这也适用于特定阈值以下的文件大小。一旦文件大小超过400 MB,我就会遇到错误。

Error tokenizing data: C error out of memory

我试图使用几个线程(1)(2)中描述的chunksize迭代。我想出了这个......

for filename in glob.iglob('*file.txt'):
    filesize = os.path.getsize(filename)
    chunklimit = 100000000
    fUniv = open(filename, 'U')
    if filesize > chunklimit:
        df = pd.read_csv(fUniv,engine='c',low_memory=False,iterator=True,
        chunksize=chunklimit)
        for chunk in df:
            mainBlock(chunk)
    fUniv.close()

虽然它可以很好地运行较小的文件,但在到达chunklimit阈值以上的文件时会出现以下错误。

'TextFileReader' object has no attribute 'columns'

我已经发现它可能正确地读取了初始块,但无法满足下一次迭代

for chunk in df:
    mainBlock(df)

因为在发送到mainBlock的if-elif-else的块中没有要评估的列标题。

错误的解释是否正确?我该如何解决这个问题?此外,一旦传递了块,我是否必须在将它们附加到文件之前将它们连接起来?非常感谢任何帮助。

0 个答案:

没有答案