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