修改块中的大csv?

时间:2014-10-08 14:09:48

标签: python csv pandas

我收到错误' TypeError:' TextFileReader'对象不支持项目分配'当我尝试在块中添加列和修改标题名称等时。

我的问题是我使用慢速工作笔记本电脑处理一个相当大的文件(1000万行)。我想添加一些简单的列(1或0值),连接两列来创建一个唯一的ID,更改其他列的dtype,并重命名一些标题,以便它们与我稍后将会出现的其他文件匹配。我可以拆分这个csv(可能选择日期范围并制作单独的文件),但我想学习如何使用chunksize或处理大文件,而不会遇到内存问题。是否可以在块中修改文件,然后将它们连接在一起?

我正在进行原始数据清理,然后将其加载到Tableau中进行可视化。

示例(读取/修改1000万行):

    > rep = pd.read_csv(r'C:\repeats.csv.gz',
    > compression = 'gzip', parse_dates = True , usecols =
    > ['etc','stuff','others','...'])
    > rep.sort() 
    > rep['Total_Repeats'] = 1
    > rep.rename(columns={'X':'Y'}, inplace = True)
    > rep.rename(columns={'Z':'A'}, inplace = True)
    > rep.rename(columns={'B':'C'}, inplace = True)
    > rep['D']= rep['E'] + rep['C']
    > rep.rename(columns={'L':'M'}, inplace = True)
    > rep.rename(columns={'N':'O'}, inplace = True)
    > rep.rename(columns={'S':'T'}, inplace = True)

2 个答案:

答案 0 :(得分:0)

只要在查看大文件时忽略.read()部分,Python通常就会很好。

如果你只是使用迭代器,你应该没问题:

with open('mybiginputfile.txt', 'rt') as in_file:
     with open('mybigoutputfile.txt', 'wt') as out_file:
           for row in in_file:
               'do something'
               out_file.write(row)

知道更多内容的人会解释它的内存方面是如何工作的,但这对我来说非常适合多GB文件而不会崩溃Python。

您可能希望将数据放入正确的数据库中,然后再杀死笔记本电脑,同时提供数据并运行Tableau!

答案 1 :(得分:0)

如果将chunk_size关键字传递给pd.read_csv,则返回csv reader的迭代器。并且您可以在追加模式下使用to_csv方法编写已处理的块。您将能够处理大型文件,但无法对数据帧进行排序。

import pandas as pd

reader = pd.read_csv(r'C:\repeats.csv.gz',
    compression = 'gzip', parse_dates=True, chunk_size=10000
    usecols = ['etc','stuff','others','...'])

output_path = 'output.csv'

for chunk_df in reader:
    chunk_result = do_somthing_with(chunk_df)
    chunk_result.to_csv(output_path, mode='a', header=False)