web-dev-qa-db-ja.com

Pythonでファイルをgzip

Pythonでファイルをgzipしたいです。 subprocss.check_call()を使用しようとしていますが、エラー「OSError:[Errno 2] No such file or directory」で失敗し続けます。私がここでしようとしていることに問題はありますか? subprocess.check_callを使用するよりもファイルをgzipするより良い方法はありますか?

from subprocess import check_call

def gZipFile(fullFilePath)
    check_call('gzip ' + fullFilePath)

ありがとう!!

30
Rinks

これを試して:

check_call(['gzip', fullFilePath])

これらのファイルのデータをどのように使用しているかによっては、Skirmantasの http://docs.python.org/library/gzip.html へのリンクも役立つ場合があります。ページの下部にある例に注意してください。データにアクセスする必要がない場合、またはPythonコードに既にデータがない場合は、gzipを実行するのが最もクリーンな方法であるため、必要ありませんPythonでデータを処理します。

19
retracile

モジュールがあります gzip 。使用法:

圧縮されたGZIPファイルを作成する方法の例:

import gzip
content = b"Lots of content here"
f = gzip.open('/home/joe/file.txt.gz', 'wb')
f.write(content)
f.close()

既存のファイルをGZIP圧縮する方法の例:

import gzip
f_in = open('/home/joe/file.txt')
f_out = gzip.open('/home/joe/file.txt.gz', 'wb')
f_out.writelines(f_in)
f_out.close()
f_in.close()

編集:

Jace Browningの答え Python> = 2.7でwithを使用すると、明らかに簡潔で読みやすいので、2番目のスニペットは次のようになります。

import gzip
with open('/home/joe/file.txt', 'rb') as f_in, gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:
    f_out.writelines(f_in)
60
Xaerxess

Python 2.7形式:

import gzip

with open("path/to/file", 'rb') as orig_file:
    with gzip.open("path/to/file.gz", 'wb') as zipped_file:
        zipped_file.writelines(orig_file)

さらに短く(テスト済みpython 2.7.6)

with open('path/to/file') as src, gzip.open('path/to/file.gz', 'wb') as dst:        
    dst.writelines(src)
30
Jace Browning

gzip モジュールを使用します。

import gzip
import os

in_file = "somefile.data"
in_data = open(in_file, "rb").read()
out_gz = "foo.gz"
gzf = gzip.open(out_gz, "wb")
gzf.write(in_data)
gzf.close()

# If you want to delete the original file after the gzip is done:
os.unlink(in_file)

エラー:OSError: [Errno 2] No such file or directory'は、ファイルfullFilePathが存在しないことを示しています。それでもそのルートに行く必要がある場合は、ファイルがシステム上に存在し、相対ではなく絶対パスを使用していることを確認してください。

5
chown

これに関するドキュメントは実際には非常に簡単です

圧縮ファイルの読み取り方法の例:

import gzip
f = gzip.open('file.txt.gz', 'rb')
file_content = f.read()
f.close()

圧縮されたGZIPファイルを作成する方法の例:

import gzip
content = "Lots of content here"
f = gzip.open('file.txt.gz', 'wb')
f.write(content)
f.close()

既存のファイルをGZIP圧縮する方法の例:

import gzip
f_in = open('file.txt', 'rb')
f_out = gzip.open('file.txt.gz', 'wb')
f_out.writelines(f_in)
f_out.close()
f_in.close()

https://docs.python.org/2/library/gzip.html

これがドキュメント全体です。 。 。

4
O.rka

Python3のドキュメント から

既存のファイルをGzip圧縮する

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

# or because I hate nested with statements

import gzip
import shutil
from contextlib import ExitStack
with ExitStack() as stack:
    f_in = stack.enter_context(open('file.txt', 'rb'))
    f_out = stack.enter_context(gzip.open('file.txt.gz', 'wb'))
    shutil.copyfileobj(f_in, f_out)

新しいgzipファイルを作成します。

import gzip
content = b"Lots of content here"
with gzip.open("file.txt.gz", "wb") as f:
    f.write(content)

コンテンツがバイトに変換されることに注意してください

上記の例のように文字列/バイトリテラルとしてコンテンツを作成しない場合の別の方法は次のとおりです。

import gzip
# get content as a string from somewhere else in the code
with gzip.open("file.txt.gz", "wb") as f:
    f.write(content.encode("utf-8"))

他のエンコード方式の説明については、 this SO question を参照してください。

3
Michael Hall
import gzip

def gzip_file(src_path, dst_path):
    with open(src_path, 'rb') as src, gzip.open(dst_path, 'wb') as dst:
        for chunk in iter(lambda: src.read(4096), b""):
            dst.write(chunk)
2
mechatroner