0

对不起,如果我的问题太基本了。我的结果从 FORTRAN 保存为文本文件,我必须使用 Python 对其进行后期处理。我尝试使用split函数来分隔不同的列,但是,不同列之间的空间并不总是相等的。那么有没有办法解决我的问题?下面是数据:

 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)
4

6 回答 6

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)

您也可以重新使您成为这样的字段的字典

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()
于 2013-03-15T04:56:49.367 回答
2

您可以使用替换功能从您的字符串中删除“/”,然后应用不带参数的拆分,这将给出您想要的我猜。试试这个:

with open("results_file.txt") as f:
    x_date  = [line.replace('/ ', '/').split() for line in f]
于 2013-03-15T04:42:30.073 回答
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']
于 2013-03-15T04:35:45.697 回答
0
line = line.split()

可能会有所帮助。

于 2013-03-15T04:34:23.280 回答
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]) 

例如,N[3] 的输出为 0.0019 :)

于 2013-03-15T05:19:56.787 回答
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']
于 2013-03-15T09:18:46.220 回答