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 つのスペースを使用すると、1 つの変数として与えられます。単一のスペースを使用すると、、、、となります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 からのものである場合、ほぼ間違いなく固定幅のフィールドであり、スペースで区切られていないため、そのように読むことをお勧めします。2 番目のフィールドが「124.0000」の場合、これら 2 つのフィールドの間に空白がなくなる可能性さえあります。

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

置換関数を使用して文字列から '/' を取り除き、params なしで分割を適用すると、私が推測したい結果が得られます。これを試して:

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
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 に答える
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 に答える