5

タイトルのように、私はいくつかのpythonを学び始めており、このテクニックを習得するのに苦労しています。私が達成する必要があるのは、いくつかの数値を読み取り、それらをリストに格納することです。テキスト ファイルは次のようになります。

0 0 3 50

50 100 4 20

基本的に、これらは Python のタートルが形状を作成するために使用する座標と方向です。唯一の問題は、それらを正しい形式にすることです。したがって、私が理解できないのは、ファイルからこれらの数値を[ [0, 0, 3, 50], [50, 100, 4, 20] ] A リストに取得する方法です。4 つの座標はそれぞれ、その 1 つの大きなリストのリストです。

これが私の試みですが、私が言ったように、助けが必要です-ありがとう。

polyShape=[]
infile = open(name,"r")
num = int(infile.readline(2))
while num != "":
    polyShape.append(num)
    num = int(infile.readline(2))
infile.close()
4

6 に答える 6

14
with open('data.txt') as f:
    polyShape = []
    for line in f:
        line = line.split() # to deal with blank 
        if line:            # lines (ie skip them)
            line = [int(i) for i in line]
            polyShape.append(line)

あなたに与える

[[0, 0, 3, 50], [50, 100, 4, 20]]

これは、空白行を含む(または含まない)ファイルで機能します。

コンストラクトを使用すると、with完了時にファイルが自動的に閉じられます。そうでない場合は、例外が発生します。

于 2012-09-04T21:21:52.567 に答える
4

入力ファイルに実際には空白行がないと仮定します。

with open(name, "r") as infile:
    polyShape = [map(int, line.split()) for line in infile]

説明:それぞれをmap(int, line.split())分割lineし、各部分をに変換しintます。[X for Y in Z]コンストラクトはリスト内包表記であり、ファイルのすべての行にマップされmap、その結果がリストに返されます。

今のところこれが複雑すぎると感じた場合は、それmap(int, line.split())が主な持ち帰りメッセージです。

于 2012-09-04T21:23:49.247 に答える
2
with open('data.txt') as f:
    lis=[map(int,x.split()) for x in f if x.strip()]   # if x.strip() to skip blank lines

   #use list(map(int,x.split()))  in case of python 3.x

これがどのように機能するかmap()です:

>>> map(int,'1 2 3 4'.split())
[1, 2, 3, 4]
于 2012-09-04T21:23:31.923 に答える
1

一発ギャグ:

[ [int(x) for x in line.split(' ')] for line in open(name,'r').readlines() if line.strip()]

しかし、そのreadlines部分はおそらく素晴らしいアイデアではありません。

他の提案された解決策のように[int(x) for x in ... ]使用するよりも速いと確信しています。map

編集

Blenderのおかげで:.readlinesクールなのは必要ないので、私たちはただ持っています:

[ map(int, line.split()) for line in open(name,'r') if line.strip()]

実際に高速で、の代わりにmap(int, )使用できるので、私も使用しました。line.split()line.split(' ')

于 2012-09-04T21:38:10.967 に答える
1

ファイルを反復処理するのが最も簡単な方法です。

poly_shape = []

with open(name, 'r') as handle:
    for line in handle:
        if not line.strip():
            continue  # This skips blank lines

        values = map(int, line.split())
        poly_shape.append(values)
于 2012-09-04T21:22:21.883 に答える
0

append大きな配列に使用することはお勧めしません。ゼロ配列を作成してそれに値を代入するよりも 50 倍遅くなります。

import numpy
fname = "D:\Test.txt";
num_lines = sum(1 for line in open(fname));
array = numpy.zeros((num_lines,4));
k = 0;
with open(fname, "r") as ins:
    for line in ins:
        a =[int(i) for i in line.split(' ')];;
         array[k,0:4] =a;
         k = k+1;
print(array)
于 2016-11-24T13:25:34.383 に答える