10

file.read()に関する Python ドキュメントには、次An empty string is returned when EOF is encountered immediately.のように記載されています。

このメソッドは、可能な限り size バイトに近い値を取得するために、基礎となる C 関数 fread() を複数回呼び出す場合があることに注意してください。また、ノンブロッキング モードの場合、サイズ パラメータが指定されていなくても、要求されたよりも少ないデータが返される可能性があることに注意してください。

Guido は f.eof() PERFECTLY CLEARを追加しないという見解を示したので、Python の方法を使用する必要があると思います!

しかし、私には明確ではありませんが、読み取りから要求されたバイトよりも少ないバイト数を受信した場合に EOF に達したという決定的なテストであるが、いくつかは受信したかどうかです。

すなわち:

with open(filename,'rb') as f:
    while True:
        s=f.read(size)
        l=len(s) 
        if l==0: 
            break     # it is clear that this is EOF...
        if l<size:
            break      # ? Is receiving less than the request EOF???

breakへの呼び出しで要求されたバイトよりも少ないバイト数を受け取った場合、潜在的なエラーfile.read(size)ですか?

4

2 に答える 2

23

あなたは蛇の皮をかぶったまま考えていません... Python は C ではありません。

まず、レビュー:

  • st=f.read() は EOF まで、またはバイナリとして開かれている場合は最後のバイトまで読み取ります。
  • st=f.read(n)はバイトを読み取ろうとしますnが、バイトを超えることはありませんn
  • st=f.readline() は一度に 1 行ずつ読み取ります。行は '\n' または EOF で終わります。
  • st=f.readlines() は readline() を使用してファイル内のすべての行を読み取り、行のリストを返します。

ファイル読み取りメソッドが EOF にある場合は、 を返します''。同じタイプの EOF テストが、StringIO、socket.makefile などの他の「ファイルのような」メソッドで使用されnますf.read(n)。この場合の の唯一の用途nは、戻り値のサイズに上限を設定することです。

Python のファイルに似たメソッドがバイト数未満を返す理由は何ですか?n

  1. EOF は確かに一般的な理由です。
  2. ネットワーク ソケットは、読み取り時にタイムアウトしても開いたままになる場合があります。
  3. 正確nなバイトは、論理的なマルチバイト文字 (\r\nテキストモードや Unicode のマルチバイト文字など) またはあなたが知らない基礎となるデータ構造の間のブレークを引き起こす可能性があります。
  4. ファイルは非ブロッキング モードで、別のプロセスがファイルへのアクセスを開始します。
  5. ファイルへの一時的なアクセス不可。
  6. ファイル、ディスク、ネットワークなどの潜在的な一時的なエラー状態。
  7. プログラムはシグナルを受信しましたが、シグナル ハンドラはそれを無視しました。

この方法でコードを書き直します。

with open(filename,'rb') as f:
    while True:
        s=f.read(max_size)
        if not s: break

        # process the data in s...

または、ジェネレーターを作成します。

def blocks(infile, bufsize=1024):
    while True:
        try:
            data=infile.read(bufsize)
            if data:
                yield data
            else:
                break
        except IOError as (errno, strerror):
            print "I/O error({0}): {1}".format(errno, strerror)
            break

f=open('somefile','rb')

for block in blocks(f,2**16):
    # process a block that COULD be up to 65,536 bytes long
于 2010-12-13T21:48:28.210 に答える
1

私のCコンパイラのドキュメントには、fread()関数について次のように記載されています。

size_t fread( 
   void *buffer,
   size_t size,
   size_t count,
   FILE *stream 
);

freadは、実際に読み取られた完全なアイテムの数を返します。エラーが発生した場合、または count に達する前にファイルの終わりに達した場合は、count より少なくなることがあります。

したがってsize、エラーが発生したか、EOF に達したことを意味します。したがってbreak、ループから抜け出すことが正しいことです。

于 2010-12-13T08:37:00.940 に答える