2014-10-08 46 views
0

当我尝试在块中添加列和修改头名称等时,出现'TypeError:'TextFileReader'对象不支持项目分配'的错误。修改大块csv块?

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

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

例(读/修改1个千万行):

> 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) 
+0

你现在在做什么?你能提供一些样品模式吗? – Scironic 2014-10-08 14:20:57

+0

用示例编辑我的帖子。 – trench 2014-10-08 16:55:12

回答

0

Python的平时还算有,只要你在看大文件时忽略.read()的一部分好。

如果你只需要使用迭代器,你应该罚款:

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!

+0

你有相应的熊猫代码吗?不幸的是,我对编码完全陌生。这是为了解决工作效率上的一些问题(我们是一个基于Excel的组织),并且我自己学习了一些熊猫。我对基础知识没有太多的理解,但是我发现清理文件等非常有价值(与在Excel中单独打开文件相比)。 – trench 2014-10-08 14:25:38

+0

对不起 - 我还没有玩大熊猫呢。怀疑你可能对Blaze有一些乐趣:http://blaze.pydata.org/docs/latest/data.html – 2014-10-08 14:27:35

+0

关于记忆如何工作。 'for in_file'方法将文件一行一行地读入内存,丢弃前一行。因此,您一次只能在内存中保存多于一行的当前文件,从而导致准备好大量文件的高效方式。对于CSV也可以考虑使用CSV内置模块,该模块具有特定的CSV解析器。 – Scironic 2014-10-08 14:30:26