2017-04-12 89 views
2

考虑下面的文件,test.dat阅读熊猫中的“长度分隔”文件?

123ABC3.5401 
456DEF3.9001 
789FED10.902 
122GRE16.003 
133SSA42.102 
145ASS45.001 

这在技术上是一个柱状的文件,但这个事实也许不是明确的,因为这将是该文件中的CSV。

此文件的列是这样分隔的:ID是前三个字符(即从索引0到2(包含零索引字符串)运行),Group从第四个字符到第六个字符运行,以及Value占用字符七至十二。

这里是我当前如何读取这个文件,并将其转换为pandas.DataFrame对象:

import pandas as pd 

col_lengths = {'ID': range(0, 3), 'Group': range(3, 6), 'Value': range(6, 12)} 
col_lengths = {k: set(v) for k, v in col_lengths.items()} 

df = pd.DataFrame(data=None, columns=col_lengths.keys()) 

with open('length_delimiter_test.dat', 'r') as f: 
    for row in f: 
     current = row.strip() 
     values_enum = list(enumerate(current)) 
     row_dict = {col: ''.join(v for idx, v in values_enum if idx in col_lengths[col]) for col in col_lengths} 
     df = df.append(row_dict, ignore_index=True) 

这给了我什么,我想:

Group ID Value 
0 ABC 123 3.5401 
1 DEF 456 3.9001 
2 FED 789 10.902 
3 GRE 122 16.003 
4 SSA 133 42.102 
5 ASS 145 45.001 

这种方法有点冗长的然而,我的口味。我基本上想通过我的col_lengths字典上面pandas.read_table类似的功能,但我没有看到熊猫文档中会允许这种行为的任何东西。事情是这样的:

df = pd.read_table('length_delimiter_test.dat', col_parser=col_lengths) 

有谁知道的大熊猫更简洁,内置的功能(或任何Python包,对于这个问题)?我没有发现任何有关解析长度分隔文件的健壮软件包。

编辑:感谢MaxU为我引荐给pandas.read_fwf

pd.read_fwf('length_delimiter_test.dat', colspecs=[(min(x), max(x)+1) for x in col_lengths.values()], header=None, names=col_lengths.keys()) 
Out[55]: 
Group ID Value 
0 ABC 123 3.5401 
1 DEF 456 3.9001 
2 FED 789 10.9020 
3 GRE 122 16.0030 
4 SSA 133 42.1020 
5 ASS 145 45.0010 
+3

没有你尝试'pd.read_fwf(...)'? – MaxU

+0

@MaxU我一定完全错过了。这正是我需要的。谢谢! – blacksite

+1

对于您的特定用例'pd.read_fwf(f,widths = [3,3,6],names = ['Group','ID','Value'])' – AChampion

回答

0

感谢MaxU(他确实应该得到这个答案的功劳)为我引荐给pandas.read_fwf

pd.read_fwf('length_delimiter_test.dat', colspecs=[(min(x), max(x)+1) for x in col_lengths.values()], header=None, names=col_lengths.keys()) 
Out[55]: 
Group ID Value 
0 ABC 123 3.5401 
1 DEF 456 3.9001 
2 FED 789 10.9020 
3 GRE 122 16.0030 
4 SSA 133 42.1020 
5 ASS 145 45.0010