2016-06-24 14 views
2

私が経験している問題は、保存されたファイルの名前です。保存されたファイルには、元のファイル名/圧縮されていないファイル名は付けられません。代わりに、保存されたファイルの名前にはアーカイブ名(拡張子「.gz」)が付けられます。Pythonで大きなファイルを圧縮するには?

予期される結果:
file.txt.gz {アーカイブ名}
.... file.txtを{格納されたファイル名}

実績:
file.txt.gz {アーカイブ名} GZIPのドキュメントを介して読み出し
.... file.txt.gz {格納されたファイル名}

https://docs.python.org/2.7/library/gzip.html)サンプルコード:

import gzip 
import shutil 
with open('file.txt', 'rb') as f_in, gzip.open('file.txt.gz', 'wb') as f_out: 
    shutil.copyfileobj(f_in, f_out) 

「file.txt.gz」ではなく「file.txt」という名前でファイルを保存するにはどうすればよいですか?

+0

だからあなたは 'file.txt'で圧縮されたファイルを保存したいですか?すなわち、既存のファイルを上書きするか? – oxalorg

+0

私は信じて* OPは 'ファイルを入れようとしています。'.gz'ファイルの中に' txt'を置いて、 '.gz'ファイルの中のファイルの名前に' file.txt'の名前をつけたいのですが、 'file.txt.gz'ファイル'file.txt.gz'を含んでいます。 –

+2

しかし、今私は周りを見ている、gzipは実際のアーカイブ形式ではなく、単にファイルの圧縮であるとは思わない-_- –

答えて

-1

gzipはアーカイブ形式ではなく、単に圧縮プロトコルであるため、gzip圧縮の場合、 'stored file name'と 'archive name'を区別していますが、これは間違った考え方です。

'gzip'ファイルを保存すると、必ずしも元のファイル名が記憶されません。元のファイルの圧縮された内容だけがあり、あなたは任意の名前を付けることができます。元のファイルと同じ名前を付けるが、 ".gz"を付けるという規則があります。 Unixシステムの「GZIP」と「gunzipの」ユーティリティファイル名のみを供給する場合は、これを仮定します:

gzip foo.txt 
# now foo.txt has been deleted, and foo.txt.gz exists 
gunzip foo.txt.gz 
# now you have foo.txt back, and foo.txt.gz has been deleted. 

あなたがbar.txt.gz、その後、gunzipしするfoo.txt.gzの名前を変更する場合、必要になりますあなたがUnixのgunzipを使っている場合は、 'goo.txt'を入手してください(ただし、他のユーティリティは何か違うことがあります)。

しかし、gzipとgunzipをストリームモードで使うことができます。その場合、gzipは実際には圧縮についてのことであり、ファイル名は気にしません。

(編集:gzipはファイル名を保存できますが、オリジナルの "ファイル"がない場合はデータのみ)、圧縮解除が完全にオプションの場合はこれを使用するかどうかはできません。

+1

私はそれが間違っていると思います。ファイル名は、おそらくWikipediaに記載されているgzipファイルヘッダに格納されています。 実際にgzipファイルの名前を変更してから解凍してみてください。以前のように元の名前のファイルが返されます。あるいは、少なくとも私がインストールしたソフトウェアでそれを取り戻している。 – brezniczky

+0

@brezniczkyは修正されて正しいですが、 "圧縮されていない名前"は 'gzip.open'で使われたファイル名から派生しています。ファイル 'foo.txt.gz'を開くと、ソースファイルが' bar.txt'と呼ばれても、ヘッダーの圧縮されていない名前は 'foo.txt'になります。ロジックについては、[gzip module source](https://github.com/python/cpython/blob/master/Lib/gzip.py#L229)を参照してください。 –

+0

あなたは正しいです、gzipが実際に元のファイル名を格納していることはわかりませんでした。 Unix gunzipはデフォルトではないため、あなたが "-N"を渡さない限り解凍時にこれを使いませんので、依存することはできません。 Pythonモジュールは何か他のことを行うかもしれませんが、一般的に、gzipはアーカイブ形式ではなくデータ圧縮形式とみなされます。 – spookylukey

1

gzip.GzipFile()を使用する必要があります。簡略gzip.open()はあなたが望むことをしません。

quothがthe doc

fileobjの非圧縮ファイルの元のファイル名を含むことができる、引数のみGZIPファイルヘッダに含まれるために使用される、Noneありません。ファイル名がの場合、デフォルトはfileobjです(認識可能な場合)。それ以外の場合は、デフォルトで空の文字列になります。この場合、元のファイル名はヘッダーに含まれません。

これを試してみてください:

import gzip 
import shutil 
with open('file.txt', 'rb') as f_in: 
    with open('file.txt.gz', 'wb') as f_out: 
     with gzip.GzipFile('file.txt', 'wb', fileobj=f_out) as f_out: 
      shutil.copyfileobj(f_in, f_out) 
関連する問題