次のようなファイル形式があります。
9 8 1
3 4 1
...
...
ここで、各行を 3 つの整数として取得したいと考えています。
私が使用したとき
for line in f.readlines():
print line.split(" ")
スクリプトはこれを出力しました:
['9', '8', '1\r\n']
['3', '4', '1\r\n']
...
...
各行を 3 つの整数として取得するにはどうすればよいですか?
あなたが持っているコードを使用して、リストを整数に変換する方法に関する特定の質問に対処します。
リスト内包表記int
を使用して、次の例で各行を繰り返し、文字列を変換できます。
与えられた:
line =['3', '4', '1\r\n']
それから:
int_list = [int(i) for i in line]
整数のリストを生成します
[3, 4, 1]
その後、添字 (0 から 2) を介してアクセスできます。例えば
int_list[0]
、3
_
int_list[1]
、4
_
等
あなたの考慮のためのより合理化されたバージョン:
with open('data.txt') as f:
for line in f:
int_list = [int(i) for i in line.split()]
print int_list
を使用する利点はwith
、完了時または例外が発生した場合に、自動的にファイルを閉じることです。
更新:
以下のコメントに基づいて、3つの異なる変数、たとえばa
、b
およびの数値がc
必要な場合は、次のことができます。
for line in f:
a, b, c = [int(i) for i in line.split()]
print 'a = %d, b = %d, c = %d\n' %(a, b, c)
これを取得します:
a = 9, b = 8, c = 1
これは、各行に 3 つの数字があることを前提としています。
余談:
「リスト内包表記」(LC) の代わりに、次の形式の「ジェネレータ式」(GE) も使用できることに注意してください。
a, b, c = (int(i) for i in line.split())
3つの整数に関する特定の問題については、これは大きな違いはありませんが、完全を期すために示しています。より大きな問題の場合、LC はメモリ内に完全なリストを一度に生成するため、より多くのメモリを必要としますが、GE は必要に応じて値を 1 つずつ生成します。この SO の質問Generator Expressions vs. List Comprehensionは、興味がある場合に詳細情報を提供します。
with open("myfile.txt") as f:
for line in f:
int_list = [int(x) for x in line.split()]
整数のリストで何をしたいかは言いません。場合によっては、整数を反復処理するより良い方法があるかもしれません。
「値が 3 つの異なる変数として必要な場合」
a, b, c = int_list
使用することもできますが:
int_list[0]
int_list[1]
int_list[2]
望んだ通りに。
line.strip().split(" ")
するでしょう。
より完全で、すべての行が 1 つの大きな文字列にそのまま残っています。
data = f.read().strip() # loose final \n
[ int(x.split(" ")) for x in data.split('\n')]
行ごとに必要な回答のリストが表示されます。
整数を3つの変数に格納したい場合:
with open('data1.txt') as f:
for line in f:
a,b,c=(int(x) for x in line.split())
print a,b,c
出力:
9 8 1
3 4 1
このコードブロックはあなたの問題を解決するはずです:
f = open(filepath)
for line in f:
intList = map(int, line.strip().split())
print intList
f.close()