2013-03-15 33 views
0

對不起,如果我的問題太基本了。我的結果被保存爲FORTRAN的文本文件,我必須使用Python後處理它。我試圖使用split函數來分隔不同的列,但是,不同列之間的空間並不總是相等的。那麼有沒有辦法解決我的問題?以下是數據:python拆分文本文件的字符串

2/ 1/1961 0.0000 0.0019 --------- 0.749E+04 0.353E-02 0.374E-03 
2/ 2/1961 0.0000 0.0021 --------- 0.748E+04 0.353E-02 0.374E-03 
2/ 3/1961 0.0000 0.0000 --------- 0.743E+04 0.350E-02 0.371E-03 
2/ 4/1961 0.0000 0.0000 --------- 0.732E+04 0.345E-02 0.366E-03 
2/ 5/1961 24.0000 24.0000 0.416E-01 0.719E+04 0.339E-02 0.360E-03 
2/ 6/1961 24.0000 0.0000 0.509E-01 0.706E+04 0.333E-02 0.353E-03 

我需要將每列保存爲Python中的單獨變量。如果我使用兩個空格作爲分隔符,我會給我2/ 5/1961 24.0000作爲一個變量。如果我使用單個空間,我將得到2/,...那麼有沒有辦法處理我的文本文件?謝謝!

x_date=[] 
fp = open("results_file.txt") 
for i, line in enumerate(fp): 
    if (i >= line_start) and (i <= line_end): 
     line = line.split(' ') 
     x_date_temp = line[0] 
     x_date.append(x_date_temp) 
+0

只要使用'.split()'會自動檢測空白 – wim 2013-03-15 04:37:56

+0

@wim,我想'」 2 /1961分之6「 '可以代表日期,所以它不該不會那樣分裂 – 2013-03-15 05:00:26

+0

哎呦錯過了 – wim 2013-03-15 05:26:31

回答

3

如果這是Fortran語言,它幾乎肯定定寬領域,沒有空格分隔,所以它的讀它的方式是一個好主意。甚至有可能,如果第二個字段可以是「124.0000」,那麼這兩個字段之間將不會有空格。

Python並沒有真正的內置讀取固定寬度字段的方法(就像csv一樣)。使用正則表達式是不是太糟糕,雖然

import re 
x_date = [] 
fp = open("results_file.txt") 
for i, line in enumerate(fp): 
    if (i >= line_start) and (i <= line_end): 
     line = re.match("(.{10})(.{8})(.{8})(.{12})(.{12})(.{12})(.{12})", line).groups() 
     x_date_temp = line[0] 
     x_date.append(x_date_temp) 

您也可以重新讓你的字段的字典一樣的N本

line_dict = re.match("(?P<date>.{10})" 
        "(?P<field1>.{8})" 
        "(?P<field2>.{8})" 
        "(?P<field3>.{12})" 
        "(?P<field4>.{12})" 
        "(?P<field5>.{12})" 
        "(?P<field6>.{12})", line).groupdict() 
+0

我喜歡re.match方法!謝謝! – 2013-03-15 05:43:24

0
line = line.split() 

可能會有所幫助。

+0

它不會工作。 – 2013-03-15 04:44:44

1

你可以做這樣的事情

In [2]: l = " 2/ 1/1961 0.0000 0.0019 --------- 0.749E+04 0.353E-02 0.374E-03" 

# this will eliminate the blank elements in the list 
In [3]: [x for x in l.split() if x] 
Out[3]: 
['2/', 
'1/1961', 
'0.0000', 
'0.0019', 
'---------', 
'0.749E+04', 
'0.353E-02', 
'0.374E-03'] 
2

您可以使用替換功能擺脫從你的字符串,然後申請沒有分裂未參數和這會給你想要我猜「/」。試試這個:

with open("results_file.txt") as f: 
    x_date = [line.replace('/ ', '/').split() for line in f] 
+0

@ tao.hong歡迎您 – 2013-03-15 04:47:04

0

容易

L = "2/ 1/1961 0.0000 0.0019 --------- 0.749E+04 0.353E-02 0.3" 
N = [x for x in L.split()] 
print (N[3]) 

輸出[3]例如爲0.0019 :)

0
import re 
f = open('results_file.txt', 'r') 

data = [ re.split(r'\s+', line, maxsplit=7) for line in f] 
for line in data: 
    print line 

然後你會得到這樣的輸出:

>>> 
['2/', '1/1961', '0.0000', '0.0019', '---------', '0.749E+04', '0.353E-02', '0.374E-03\n'] 
['2/', '2/1961', '0.0000', '0.0021', '---------', '0.748E+04', '0.353E-02', '0.374E-03\n'] 
['2/', '3/1961', '0.0000', '0.0000', '---------', '0.743E+04', '0.350E-02', '0.371E-03\n'] 
['2/', '4/1961', '0.0000', '0.0000', '---------', '0.732E+04', '0.345E-02', '0.366E-03\n'] 
['2/', '5/1961', '24.0000', '24.0000', '0.416E-01', '0.719E+04', '0.339E-02', '0.360E-03\n'] 
['2/', '6/1961', '24.0000', '0.0000', '0.509E-01', '0.706E+04', '0.333E-02', '0.353E-03']