2009-08-03 16 views
1

pythonでファイルを読む方法を理解しようとしています。Pythonでファイルを読む

import os.path 

filename = "A 180 mb large file.data" 
size = os.path.getsize(filename) 

f = open(filename, "r") 
contents = f.read() 
f.close() 

print "The real filesize is", size 
print "The read filesize is", len(contents) 

f = open(filename, "r") 

size = 0 

while True: 
    contents = f.read(4) 
    if not contents: break 
    size += len(contents) 

f.close() 

print "this time it's", size 

出力::ここで起こっていただきました!

The real filesize is 183574528 
The read filesize is 10322 
this time it's 13440 

誰かが知っているこれは私がやった、それはかなり正常に動作していない何ですか? :)

+1

Windowsを使用していますか?代わりにモード "rb"でファイルを開くとどうなりますか? – Amber

答えて

5

ファイルがCライブラリを混乱させる場合、結果は期待されます。

OSは180Mbだと思います。

しかし、nullバイトが散在しているため、C stdioライブラリが混乱する可能性があります。

「rb」でファイルを開いて、別の結果が得られるかどうかを確認してください。

3

最初のファイルサイズはバイト単位で、それ以外の場合はというファイルと、文字のというファイルとして読み取られます。 open(filename, "r")open(filename, "rb")に変更すると動作します。

+0

文字列のサイズをバイト単位で確認するにはどうすればよいですか?それはあなたが得るものなので、f.readの文字列ではありませんか?あるコンピュータから別のコンピュータにファイルを送信したいとします。大きなファイルであるため、1つずつ送信する必要があります。まず第一に、送信側のコンピュータはファイルのサイズを送信するので、他のコンピュータは何を期待するかを知ることになります。その後、ファイルの送信を開始します。他のコンピュータは、どれだけのバイト数を計算しなければならないので、ファイル全体がいつ送信されたかを知ることができます。それでどうやって確認するの? – quano

0

これは文字列に関するものではありません。Pythonは文字列のnullバイトに完全に満足しています。

これは、Windows上にあり、テキストモードでファイルを開くため、すべての "\ n"を "\ r \ n"に変換して、すべてのバイナリデータを破棄するためです。

ファイルをモード "rb"でバイナリモードで開きます