在Python 2.7中解析具有两种不同行格式的大型CSV文件,并且内存有限制吗?

时间:2016-12-09 15:15:22

标签: python python-2.7 pandas pytables hdfstore

我有一个文件集合(一个~10GB文件分成多个文件,因此每个约1GB),我需要在Python 2.7中阅读。文件格式如下:

objectId

1|KEY1|A |B |01/01/2016| | 2|KEY1| |LINEINDEX1|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2|KEY1| |LINEINDEX2|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2|KEY1| |LINEINDEX3|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2|KEY1| |LINEINDEX4|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1|KEY2|A |B |01/01/2016| | 2|KEY2| |LINEINDEX5|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | |1 | | | | | | | | | | | | | | | | | | | | | | |N | | | | | | | | | | | | 2|KEY2| |LINEINDEX6|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | |4 | | | | | | | | | | | | | | | | | | | | | | |O | | | | | | | | | | | | 开头的行可以无限期地重复唯一的2值,然后下一行将以LINEINDEX#开头,以获取新的1项(后跟它自己的行KEY,等等。我需要能够基于多个2有效地生成数据类型2的表格,因此我根本不需要行KEY。空字段中可能有数据,也可能没有,所以我需要捕获那里的所有内容。

围绕这些数据的大多数程序使用Pandas,所以我理想地坚持这一点。我的计划是将这些文件解析为HDF5文件,并根据需要从中创建表。我不确定这是否是处理手头问题的最佳方式,因此欢迎任何有关替代方案的建议。目前,此处理是通过ffdf在R中完成的,但必须将其移至Python。

我无法逐行读取这些文件(几乎立即弹出内存)以删除/忽略行1。我用1尝试了Pandas read_csv,将这些行视为"评论"并且忽略它们,但是我得到了CParserError,这似乎比基于其他帖子的任何东西都更多(我尝试跳过第一行,因为其他人建议用于该错误,但它没有做到这一点)。

comment='1'

如果我在没有指定数据类型(我有)的情况下处理文件,就会出现性能问题,例如:

pandas.io.common.CParserError: Error tokenizing data. C error: Expected 4 fields in line 504, saw 14

然后,在转换sys:1: DtypeWarning: Columns (21) have mixed types. Specify dtype option on import or set low_memory=False. 时,类似的性能问题:

to_hdf

最好的方法是忽略以C:\Python27\lib\site-packages\pandas\core\generic.py:1138: PerformanceWarning: your performance may suffer as PyTables will pickle object types that it cannot map directly to c-types 一起开始的行,或者以某种方式指定两个不同的dType映射,而不会耗尽内存,每次我尝试在一行上都会发生这种情况逐行?有没有更好的方法来存储此数据,以便根据1的列表查询订单项2

现在,代码很简单:

KEY

1 个答案:

答案 0 :(得分:0)

这将在管道之间提取任何数据,没有空格,并将该信息转储到新文件中。它只会写出包含字符串if x.replace(' ','')的行,如果管道之间的值是所有空格,则忽略它。如果需要保留管道之间的空值,请从列表解析中删除if子句(with open('/path/to/in_file.csv', 'r') as fp: with open('/path/to/out_file.csv', 'w') as fp2: for line in fp: if 'LINEINDEX' in line: out = [x.replace(' ','') for x in line.strip().split('|') if x.replace(' ','')] fp2.write(','.join(out)+'\n') )。

{{1}}

这应该没有内存问题,因为每次读取和写入一个文件,而不是将整个文件加载到内存中。