2013-02-02 59 views
0

我想讀取一個很差的文本文件,因爲每行中的值有時不能用空格或逗號分隔(所以我不能使用.split()) 。我想像你在FORTRAN中那樣閱讀它,在那裏我確切地告訴它每個值在哪裏。這是我正在嘗試的。有沒有人知道更好的方法來做到這一點?謝謝 !Python IO:使用格式說明符讀取文件

f=open('f.out','r') 

lines = f.readlines() 

nLines = len(lines) 
data = {} 


keys = {'SPE':[0, 2, np.int],    #I2 
     'SPEISO':[2, 3, np.int],   #I1 
     'wnum':[3,15, np.float64],  #F12.6 
     'S':[15, 25, np.float64],  #E10.3 
     'Ecoeff':[25, 35, np.float64],  #E10.3 
     'AGA':[35, 40, np.float64],  #F5.5 
     'SGA':[40, 45, np.float64],  #F5.4 
     'ELO':[45, 55, np.float64],  #F10.4 
     'N' :[55, 59, np.float64],  #F4.2 
     'FSH':[59, 67, np.float64],  #F8.6 
     'TRS':[67, 127, np.str], 
     'IERR': [127, 133, np.int], 
     'IEFF': [133, 145, np.str], 
     'other': [145,160, np.str] } 

for k in keys: 
    data[k] = np.zeros(nLines) 

for i, l in enumerate(lines): 
print i 
    for k in keys: 
    print k 
    data[[k][i]] = l.format(keys[k]) 

回答

1

您可能能夠使用read_fwf函數從pandas庫。

喜歡的東西:

import pandas 
pandas.read_fwf('f.out', 
    colspecs=[x[:2] for x in keys.values()], 
    dtype=[x[2] for x in keys.values()] 
    ) 
+0

太好了!它看起來像它的工作。現在我只需要弄清楚這個DataFrame對象是如何工作的,這樣我就可以將我的值轉換爲常規數組。 – user2036115

+0

您可以將DataFrame視爲多個列,其中每列表示一個numpy數組。你也可以將它轉換爲一個numpy記錄數組('dataframe.to_records()'),但是你可能想要使用dataframe對象本身的很好的特性。 – SiggyF