-2

ファイルの読み取りループが行をスキップする理由がわかりません。

別のドキュメントで実行する前に、txt ドキュメントを解析する単純なプログラムを Python で作成しようとしています。私が本質的に持っているのは、リスト内のリストに解析しようとしている三角形のように見えるテキストファイルです。

1

2 3

4 5 6

7 8 9 10

の中へ

[[1],[2,3],[4,5,6],[7,8,9,10]]

ただし、以下のコードでは、while ループが 1 行おきに「スキップ」しているように見えるため、上記のリストを取得する代わりに、[[2,3],[7,8,9,10]]. さらに困惑しているのは、最後の行をコメントアウトすると、while ループが正確に正しい回数 '1' を出力することです。

f = open('test.txt')
triangle = []

while f.readline() != '':
    print 1
    triangle.append(map(int,f.readline().strip().split()))
4

3 に答える 3

11

を呼び出すたびf.readline()に、1 行読み上げます。ループ内で呼び出すためf.readline()、ループ内で余分な行を読み取っています。必要なことを行うためのより簡単な方法は、ファイルを直接反復処理することです。

for line in f:
    # do whatever you want with the line.
于 2012-06-16T03:57:35.963 に答える
3

[[], [], [], []] ファイルの先頭に空の行を追加するだけで、この例が生成されます[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]

これを試すこともできます:

triangle = [ [int(value) for value in line.split(' ') if value.strip()] 
                 for line in open('test.txt') if line.strip()]

リスト内包表記は、標準のループよりも高速です。すべてのエントリが整数であると仮定すると、このコードは空の行に関係なく動作します。

どうやら誰もが LC を好んでいるわけではないので:

triangle = []
with open('test.txt', 'r') as f:
    for index, line in enumerate(f):
        if line.strip():
            value = []
            for number in line.split(' '):
                if number.strip():
                    try:
                        value.append(int(number))
                    except Exception as ex:
                        print 'Failed to convert %s at line %i' % (number, index)
                        print 'Exception %s' % str(ex)                        
                        raise ex
            triangle.append(value)
print triangle

生産する[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]

LCが好きな人もいれば、標準のforループが好きな人もいますが、それはすべて意見/好みの問題ですが、そうです、forループtry ... except ...は、どの行で失敗したかを伝えることができるので、少し優れていますが、もう一度言及しましたすべての値が整数である限り、LC は問題ありません。

$ python -m timeit 'execfile("test.py")'
10000 loops, best of 3: 198 usec per loop
$ python -m timeit 'execfile("test1.py")'
10000 loops, best of 3: 130 usec per loop

したがって、基本的には35%標準に対する改善ですが、これも個人次第です。私は個人的に非常に大きなデータセットを扱っているので、可能な限り最適化しようとしています。

于 2012-06-16T04:01:59.230 に答える
1
with open('data1.txt') as f:
        lis=[map(int,x.split()) for x in f if x.strip()]
print(lis)

[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]

説明:

を使用してファイルを 1 行ずつ読み取り、適用後の値がまたはと等しくなるfor x in f行をスキップします。strip()False''

次に、 と を使用map()split()て のリストを作成しますint

于 2012-06-16T04:08:28.103 に答える