2017-04-12 60 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