我有一个文件集合(一个~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
答案 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}}
这应该没有内存问题,因为每次读取和写入一个文件,而不是将整个文件加载到内存中。