0

我有一组需要在 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#值,然后下一行将以1KEY项目开头(随后是它自己的行2,依此类推)。我需要能够有效地生成2基于多个KEYs 的数据类型表,所以我实际上根本不需要行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')
4

1 回答 1

0

这将提取管道之间的任何数据,没有空格,并将该信息转储到新文件中。它只会写出包含字符串的行,'LINEINDEX'如果管道之间的值都是空格,则忽略它。如果您需要保留管道之间的空值,请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')

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

于 2016-12-09T15:36:54.043 回答