python拆分文本文件的字符串

时间:2013-03-15 04:32:02

标签: python split

很抱歉,如果我的问题太基础了。我的结果保存为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)

6 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

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

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

答案 2 :(得分: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']

答案 3 :(得分:0)

line = line.split()

可能会有帮助。

答案 4 :(得分: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

答案 5 :(得分: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']