我有一组需要在 Python 2.7 中读取的文件(一个 ~10GB 文件分成多个文件,因此每个文件约 1GB)。文件格式是这样的:
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
s 的数据类型表,所以我实际上根本不需要行1
。空字段中可能有也可能没有数据,所以我需要捕获那里的所有内容。
围绕这些数据的大多数程序都使用 Pandas,所以我理想情况下试图坚持这一点。我的计划是将这些文件解析为 HDF5 文件,并根据需要从中创建表。我不确定这是否是解决手头问题的最佳方法,因此欢迎任何有关替代方案的建议。目前,此处理是通过 ffdf 在 R 中完成的,但必须将其移至 Python。
我无法逐行读取这些文件(几乎立即弹出内存不足)来删除/忽略行1
。我尝试read_csv
使用Pandascomment='1'
将这些行视为“注释”并忽略它们,但我得到了 CParserError,这似乎比基于其他帖子的任何内容都更像一个错误(我尝试跳过第一行,因为其他人建议该错误,但它没有起到作用)。
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
什么是最好的方法来忽略以 all-together 开头的行1
,或者以某种方式指定两个不同的 dType 映射,而不会耗尽内存,每次我尝试逐行工作时都会发生这种情况?2
有没有更好的方法来存储此数据以根据 s 列表查询行项目KEY
?
现在,代码很简单:
for input_file in os.listdir(input_path):
file_path = input_path + '\\' + input_file
data = pd.read_csv(file_path, sep='|')
data.to_hdf(self.outputs_path + '\converted.h5', 'converted_table')