2013-10-08 8 views
8

でファイル全体を読んで、私は、ファイルsomething.zipから全ソースデータを読み取る必要がある(それを解凍していない)は一度

私は

f = open('file.zip') 
s = f.read() 
f.close() 
return s 

を試してみましたが、それはほんの数バイト、全体ではなく、ソース・データを返します。どのようにそれを達成するためのアイデア?ありがとう

+15

バイナリファイルを扱うときにバイナリモードを使用します。 'open( 'file.zip'、 'rb')' – falsetru

+0

私が正しく理解していれば、バイナリモードは新しい行とWindows上でしか扱わないので、問題は解決しません。どのようにバイトを数えていますか? – Vlad

+4

@Vlad Windowsのテキストのみモードで読み込みを終了できるEOF(ファイルの終わりの文字)があります。 –

答えて

20

バイナリファイルを扱うときにバイナリモード(b)を使用してください。

def read_zipfile(path): 
    with open(path, 'rb') as f: 
     return f.read() 

ところで、マニュアルcloseの代わりにwith statementを使用しています。

2

これはそれを行う必要があります。比較のために

In [1]: f = open('/usr/bin/ping', 'rb') 

In [2]: bytes = f.read() 

In [3]: len(bytes) 
Out[3]: 9728 

を、ここで私は上記のコードで開いたファイルがあります:

-rwx------+ 1 xx yy 9.5K Jan 19 2005 /usr/bin/ping* 
3

としては.read()を終了EOF文字(0x1A)がある言及操作。これを再現するには:

# Create file of 256 bytes 
with open('testfile', 'wb') as fout: 
    fout.write(''.join(map(chr, range(256)))) 

# Text mode 
with open('testfile') as fin: 
    print 'Opened in text mode is:', len(fin.read()) 
    # Opened in text mode is: 26 

# Binary mode - note 'rb' 
with open('testfile', 'rb') as fin: 
    print 'Opened in binary mode is:', len(fin.read()) 
    # Opened in binary mode is: 256