0

次のようなファイルがあります。

@ junk
...
@ junk
    1.0  -100.102487081243
    1.1  -100.102497023421
    ...   ...
    3.0  -100.102473082342
&
@ junk
...

@と文字の間にある2列の数字だけに興味があり&ます。これらの文字は、ファイル内の他の場所に表示される場合がありますが、数字ブロック内には表示されません。

最初の列と2番目の列の2つのリストを作成したいと思います。

List1 = [1.0, 1.1,..., 3.0]
List2 = [-100.102487081243, -100.102497023421,..., -100.102473082342]

私はシェルスクリプトを使用して、リストを作成するより単純なPythonスクリプト用にこれらのファイルを準備してきましたが、より一貫性のあるアプリケーションのために、これらのプロセスをPythonに移行しようとしています。何か案は?Pythonとファイル処理の経験は限られています。

編集:言及する必要があります、この番号ブロックはファイルの2つの場所に表示されます。両方のナンバーブロックは同一です。

Edit2:カスタムライブラリに入れるので、これには一般的な関数で十分です。

現在の取り組み

私は現在、シェルスクリプトを使用して、数値ブロック以外のすべてを2つの別々の列にトリミングしています。そこから、次の関数を使用するのは簡単です。

def ReadLL(infile):
    List = open(infile).read().splitlines()
    intL = [int(i) for i in List]
    return intL

私のメインからそれを呼び出すことによって

import sys
import eLIBc
infile = sys.argv[1]
sList = eLIBc.ReadLL(infile)

問題は、シェルスクリプトを使用するのではなく、Pythonを使用して元のファイルから数値ブロックを抽出する方法を知っていることです。

4

2 に答える 2

1

ファイル自体をループし、文字のない最初の行を見つけたときにフラグを設定します@。その後、番号の収集を開始できます。&行に文字が見つかったら、読みを中断します。

def readll(infile):    
    with open(infile) as data:
        floatlist1, floatlist2 = [], []
        reading = False

        for line in data:
            if not reading:
                if '@' not in line:
                    reading = True
                else:
                    continue

            if '&' in line:
                return floatlist1, floatlist2

            numbers = map(float, line.split())
            floatlist1.append(numbers[0])
            floatlist2.append(numbers[1])

したがって、上記:

  • 'reading'をに設定し、なしの行が見つかっFalseた場合にのみ、に設定されます。'@'True
  • 'reading'がTrue
    • 行に含まれている場合に読み取られたデータを返します&
    • それ以外の場合、行には空白で区切られた2つのfloat値が含まれていると見なされ、それぞれのリストに追加されます。

戻ると、関数は終了し、ファイルは自動的に閉じられます。最初のブロックのみが読み取られ、ファイルの残りの部分は単に無視されます。

于 2013-01-24T17:50:36.217 に答える
1

これを試してみてください:

with open("i.txt") as fp:
    lines = fp.readlines()
    data = False
    List1 = []
    List2 = []
    for line in lines:
        if line[0] not in ['&', '@']:
            print line
            line = line.split()
            List1.append(line[0])
            List2.append(line[1])
            data = True
        elif data == True:
            break

print List1
print List2

これにより、最初の数字のブロックが得られます。

入力:

@ junk
@ junk
1.0  -100.102487081243
1.1  -100.102497023421
3.0  -100.102473082342
&
@ junk
1.0  -100.102487081243
1.1  -100.102497023421

出力:

['1.0', '1.1', '3.0']
['-100.102487081243', '-100.102497023421', '-100.102473082342']

アップデート

両方のブロックが必要な場合は、次を使用します。

with open("i.txt") as fp:
    lines = fp.readlines()
    List1 = []
    List2 = []
    for line in lines:
        if line[0] not in ['&', '@']:
            print line
            line = line.split()
            List1.append(line[0])
            List2.append(line[1])

print List1
print List2
于 2013-01-24T17:50:37.593 に答える