【问题标题】:Modifying large csv in chunks?分块修改大型csv?
【发布时间】:2018-03-24 04:03:51
【问题描述】:

当我尝试分块添加列和修改标题名称等时,我收到错误“TypeError: 'TextFileReader' object does not support item assignment”。

我的问题是我正在使用一台运行缓慢的笔记本电脑来处理一个非常大的文件(1000 万行)。我想添加一些简单的列(1 或 0 值),连接两列以创建唯一 ID,更改其他列的 dtype,并重命名一些标题,以便它们与我稍后将 .merge 的其他文件匹配。我可能会拆分这个 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)

【问题讨论】:

  • 你目前做得怎么样?能否提供一些示例模式?
  • 用一个例子编辑了我的帖子。

标签: python csv pandas


【解决方案1】:

如果您将chunk_size 关键字传递给 pd.read_csv,它会返回 csv 阅读器的迭代器。并且您可以在附加模式下使用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)

【讨论】:

    【解决方案2】:

    只要您在查看大文件时忽略 .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 的任务杀死您的笔记本电脑!

    【讨论】:

    • 你有对应的pandas代码吗?不幸的是,我对编码完全陌生。这是为了解决一些工作效率问题(我们是一个基于 Excel 的组织),我自己学习了一些 pandas。我对基础知识了解不多,但我发现清理我们的文件等非常有价值(与在 Excel 中单独打开文件相比)。
    • 抱歉 - 我还没有玩过 pandas。怀疑你可能会对 Blaze 感兴趣:blaze.pydata.org/docs/latest/data.html
    • 就内存的工作方式而言。 for row in_file 方法将文件逐行读取到内存中,并在继续前进时丢弃前一行。因此,您一次在内存中的当前文件不会超过一行,从而为准备大量文件提供了一种有效的方法。同样对于 CSV,请考虑使用具有特定 CSV 解析器的 CSV 内置模块。
    猜你喜欢
    • 2014-04-16
    • 2015-10-10
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多