5

私は Python を使い始めたばかりで、バックグラウンドがより低レベルの言語 (Java、C++) にあるため、実際にはいくつかのことを理解できません。

したがって、Python では、たとえばテキスト ファイルを開いてファイル変数を作成し、次のようにその行を繰り返すことができます。

f = open(sys.argv[1])
for line in f:
    #do something

ただし、f[0]インタープリターを試してみると、エラーが発生します。では、オブジェクトにループを 適用できる場合、オブジェクトにはどのような構造がfあり、一般的にどのように知ることができますか?for ... in ... :

4

10 に答える 10

2

これは、インデックス作成、スライス、および限定された反復をサポートするシーケンス型と、インデックス作成またはスライスをサポートしないが、それを行うための内部状態を維持するより高度な反復をサポートする反復子型の違いを示しています。

ファイルオブジェクトは後者の例です。readlines他の人が指摘しているように、コンテンツを行として抽出し、メソッドを介してシーケンス型 (具体的にはリスト) に格納できます。

于 2013-05-19T17:51:53.540 に答える
2

Python では、すべてのデータ項目が Python オブジェクトです。したがって、によって返されるものはすべてopen()オブジェクトです。具体的にはfile、ファイル ハンドルを表すオブジェクトです。

あなたはすでにこれを行う方法を知っています:

handle = open("some_file.txt, "r")

これは、概念的には、C の同等のものと非常によく似ています。

FILE *handle;

handle = fopen("some_file.txt", "r");

handleC では、その変数でできる唯一の便利なことは、 のような呼び出しに渡すことfread()です。Python では、オブジェクトにメソッド関数が関連付けられています。したがって、ファイルから 100 バイトを読み取り、それを閉じる C は次のとおりです。

FILE *handle;

handle = fopen("some_file.txt", "r");
result = fread(buffer, 1, 100 handle);  // read 100 bytes into buffer
fclose(handle);

そして、これは同等の Python です:

handle = open("some_file.txt", "r");
handle.read(100)
handle.close()

Python の関数とオブジェクトについて詳しく調べるにはhelp()、Python プロンプトから組み込みコマンドを使用するのが良い方法です。試してみるhelp(open)と、多くはわかりませんが、ファイル オブジェクトが返されることがわかります。それで、試しhelp(file)てみると、たくさんの情報が得られます。.close()メソッド、.read()、および などの他の方法について読むことができます.readlines()

しかし、あなたを混乱させたのは、ハンドル オブジェクトの反復処理でした。非常に一般的なケースはファイルから行を読み取ることであるため、Python はファイル ハンドルをiteratorとして機能させ、反復するとファイルから一度に 1 行ずつ取得します。

Python のリスト オブジェクトはindexableiterableの両方であるため、名前が付けられたリストがある場合は、oraの両方を実行できます。アイテムを位置で検索する、 は索引付けです。ファイル ハンドル オブジェクトはインデックス作成をサポートしていませんが、反復はサポートしています。a[i]for x in a:a[i]

ここでのいくつかの回答では、withステートメントが表示されます。これは Python でのベスト プラクティスです。withステートメントは、Python の一部の種類のオブジェクトでのみ機能します。オブジェクトは、いくつかの特別なメソッド関数をサポートする必要があります。現時点で本当に知っておく必要がwithあるのは、それを使用できるようになったときに、必要な初期化とファイナライズの作業がいくつか行われるということだけです。ファイルを開く場合、withステートメントはファイルを閉じます。重要な部分はwith、コードが例外を発生させた場合でも、ステートメントがファイナライズが行われることを保証することです。

上記の例の慣用的な Python は次のとおりです。

with open("some_file.txt") as handle:
    buffer = handle.read(100)
于 2013-05-19T18:05:31.000 に答える
1

あなたが探しているのはreadlines http://docs.python.org/2/library/stdtypes.html#file.readlinesです

file_lines = f.readlines()

for line in file_lines:
    print line

print file_lines[0] # You can access an element by index
于 2013-05-19T17:41:30.290 に答える
0

ファイル変数は、C のファイル ハンドラーのようなものです。それを開いて操作 (読み取り、書き込み) し、最後に閉じます。

handler.read() # read all file content at once

handler.write(blob) # write there something

handler.readlines() # read list with lines

for line in handler:
    print line # iterate lines nicely

for line in handler.readlines()最初の例は必要なときに行を読み取り、2 番目の例はすべての行を一度に消費するため (大きなファイルでは問題になる可能性があります)、最後の例は よりも優れています。

于 2013-05-19T17:41:49.807 に答える