質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

3905閲覧

pythonでbz2に圧縮する方法

yositigu

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/06/05 03:30

pythonでbzip圧縮を行いたいのですが、エラーとなります。
対策方法を教えてください。

python

1# -*- coding: utf-8 -*- 2 3import os 4import bz2 5 6def main(): 7 path = 'test.txt' 8 print(os.path.exists(path)) 9 bz2.compress(path) 10 11if __name__ == "__main__": 12 main()

エラー
Traceback (most recent call last):
adada
File "/Users/xxxxx/Desktop/python_study/bz2_test.py", line 17, in <module>
main()
File "/Users/xxxxx/Desktop/python_study/bz2_test.py", line 13, in main
bz2.compress(path)
File "/Users/xxxxx/anaconda3/envs/py37/lib/python3.7/bz2.py", line 334, in compress
return comp.compress(data) + comp.flush()
TypeError: a bytes-like object is required, not 'str'

Process finished with exit code 1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

test.txtを圧縮したファイル(text.txt.bz2みたいな・・・)を作りたいということでしょうか。

bz2.compressの第一引数はbytes-like objectである必要があるので、openrbモードで開いてreadでまるごと読み込んだものを渡してあげれば動きます。結果はまた別途書き出す必要があります。

python

1 with open(path, "rb") as f1: 2 data = f1.read() 3 with open(path + ".bz2", "wb") as f2: 4 f2.write(bz2.compress(data))

でもこうするのは労力の無駄な上に遅いはずなので、たとえばUNIX系のシステムならシステムに入っている(であろう)bz2圧縮のコマンドをsubprocess.callでも使って呼んだ方が良いでしょうし、それなら最初からシェルスクリプトで書くというのも一つの手でしょう。

pythonプログラムで生成したデータを圧縮して吐き出したい、というときはこういう機能も使えますが(ただし標準モジュールのbz2を直接叩くよりは、wrapperになるライブラリをかますことの方が多いでしょう)、単に既存のファイルを圧縮するにはあんまり向いていません。

追記

bz2モジュールの機能を使う限りは、「圧縮元のファイルを自分で開いて読み込む必要がある」ということです。

python

1import os 2import bz2 3 4def main(): 5 path = 'test.txt' 6 with open(path, "rb") as f1: 7 data = f1.read() 8 with bz2.BZ2File(path + ".bz2", mode="w") as f2: 9 f2.write(data) 10 11if __name__ == "__main__": 12 main()

投稿2019/06/05 03:50

編集2019/06/05 04:03
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yositigu

2019/06/05 03:57

ありがとうございます。 上記のような書き方ではなく、 BZ2Fileという関数を使えば もっとシンプルにできたりしないでしょうか?
hayataka2049

2019/06/05 04:03

追記に載せてみました。シンプルになったかどうかはなんともいえないレベルだと思います。
yositigu

2019/06/05 04:07

ありがとうございます。 回答すると元のファイル名(test.txt)がtest 2.txtになってしまい、元のファイル名を変えない方法をご存知でしょうか?
yositigu

2019/06/05 04:08

また、subprocess.callを使ったやり方を教えていただけないでしょうか?
hayataka2049

2019/06/05 04:20

>回答すると元のファイル名(test.txt)がtest 2.txtになってしまい、元のファイル名を変えない方法をご存知でしょうか? まず、このコメントに2つ疑問点があります。 ・私の回答の通りやると結果のファイルの名前はtest.txt.bz2になるはずです。 ・test.txtとして吐き出すこともできますが、そうすると元のファイルが上書きされてしまいます(たとえばエディタなどで開けなくなる)。また、普通は拡張子でファイルのフォーマットを判断しますので、変えないとまずいです。
hayataka2049

2019/06/05 04:26 編集

最近のバージョンではsubprocess.runが推奨されていますので、こちらを使います。 https://docs.python.org/ja/3/library/subprocess.html import subprocess path = 'test.txt' subprocess.run(["bzip2", "-k", path]) これはOSにbzip2コマンドが存在するかどうかに依存するコードです。おそらくそのまま動くであろうと言えるのはUNIX系(Linux, macOS: macOSについてはデフォルトで入っているかどうかは確認していませんのでご注意ください)だけなのでご注意ください。
yositigu

2019/06/05 04:29

ありがとうございます。 Test.txt.bz2をtest.bz2にする また解凍するときちんとファイル名がtest.txtになっている の方法をご教授いただけないでしょうか? Subprocessの方法でお願いします。
hayataka2049

2019/06/05 11:11

一発でやるのはbzip2コマンドでは無理です。もう一行足してmoveを呼んでファイル名を変えるのが一番簡単なやり方です。それか、他の圧縮機能のあるコマンドを探すべきでしょう(思いついたら書くつもりだっけど、思いつかなかった)。 ただ、こういうものについては慣習的な命名に従うことをおすすめします。自分にとってわかりづらくなるだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問