2013-07-09 32 views
0

我正在處理一個生成特定文件格式的程序,我必須使用python腳本來讀取和修改它。這個文件應該是製表符分隔的,但我一直無法識別製表符。任何好的方法來閱讀這種文件,並在相同的格式生成一個新的?用python猜測文本文件的縮進

1. Base Year Data for Calibration 
    1.1 Observed Data per Internal Zone 
     Sector  Zone ExogProd InducedPro ExogDemand  Price ValueAdded Attractor 
      1  1  5000   0   0 14409.8204   0   1 
      1  2  800   0   0 12628.4625   0   1 
      1  3  1100   0   0 12676.3341   0   1 
      2  1   0 3393.2241   0 13944.0613   0   1 
      2  2   0 732.1119   0 12340.4575   0   1 
      2  3   0 974.6630   0 12132.7666   0   1 
      3  1   0 4491.8722   0 2701.8266   0   1 
      3  2   0 12755.9657   0 2445.0556   0   1 
      3  3   0 4752.1604   0 2671.2305   0   1 
      4  1   0 1790.7874   0 3858.0189   0   1 
      4  2   0 3076.6366   0 3337.8784   0   1 
      4  3   0 11132.5806   0 3728.1412   0   1 
      5  1   0 69.5126   0  250000  250000   1 
      5  2   0 109.5081   0  120000  120000   1 
      5  3   0 124.2133   0  180000  180000   1 

的問題是,當我讀到這與line.split(「\ T」)蟒,我只與整行結束。

+0

如果這是您的實際數據文件的「複製粘貼」,它似乎被格式化爲空格,而不是製表符。你有沒有試過'line.split()'? –

+0

看起來這個例子的格式是固定的字段寬度:最不重要的數字是對齊的,而不是最重要的數字。 – 2013-07-09 12:37:53

+0

此外,是否需要製表符分隔外部要求?如果您完全控制了軟件設計,那麼我會建議使用機器可讀的格式(JSON,XML,CSV等)而不是人類可讀的格式,因爲其目的是使用Python生成和解析它們。 – 2013-07-09 12:39:23

回答

2

正如其他人在評論中指出的,這似乎只是一個空格分隔的文件,單元格之間的空間數量可變。如果是這樣的話,你可以從一個特定的行這樣提取細胞:

cells = line.split() 

至於再生它,你需要墊各列不同的寬度。一種方法是使用如下代碼:

widths = [12,9,11,11,11,11,11,11] 
paddedCells = [string.rjust(cell,widths[i]) for i,cell in enumerate(cells)] 
line = ''.join(paddedCells) 
+0

實際上我使用的是 「%12d%8d%10.2f%10.2f%10.2f%10.2f%10.2f%10.1f \ n」 – tcapelle

+0

@tcapelle回想起來,這使您在處理實際的數字而不僅僅是字符串。隨意發佈您自己的解決方案並將其標記爲已接受。 –

0

其實我使用

%12d %8d %10.2f %10.2f %10.2f %10.2f %10.2f %10.1f\n 

這個問題似乎是文件是如何生成的。我很確定不是製表符分隔的文件。