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
没有你尝试'pd.read_fwf(...)'? – MaxU
@MaxU我一定完全错过了。这正是我需要的。谢谢! – blacksite
对于您的特定用例'pd.read_fwf(f,widths = [3,3,6],names = ['Group','ID','Value'])' – AChampion