カテゴリー別アーカイブ: Python

Python で Zip ファイルを作成する


Python とソケット通信を使ってファイルを送信する必要があり、複数ファイルを Zip ファイルにして送信することにしました。作り方さえわかれば、下記のように簡単に作成することが出来ます。

Zip ファイルは格納するファイル毎に圧縮するかどうかを選択することが出来ます。PNG などの画像ファイルをは元々圧縮されているので、Zip 圧縮したとしても大して容量が減らない上に、伸張処理が必要になってしまいます。そのためあえて圧縮せずに Zip に放り込むということで無駄な圧縮伸張の時間を省くという方法もあります。

import zipfile
 
zip = zipfile.ZipFile( 'Zipファイル名', mode='w', compression=zipfile.ZIP_STORED )
# テキストファイルなど Zip 圧縮する場合
zip.write( 'Zip 圧縮する対象ファイル名', 'Zip 内に格納する名前', zipfile.ZIP_DEFLATED )
# 画像ファイルなど圧縮せずに Zip ファイルにする場合
zip.write( 'Zip 圧縮する対象ファイル名', 'Zip 内に格納する名前', zipfile.ZIP_STORED )
zip.close()

エラー処理などは省いているので、必要に応じて追加して下さい。

作成した Zip ファイルを送信したい場合はバイナリファイルとして開いてデータを読み出し、送信すれば良いです。

bin_file = open( 'Zip ファイル名', "rb" )
# bin_data に格納してこれを送信する
bin_data = bin_file.read()
bin_file.close()

Python 3 系を使ったソケット通信


ちょっと Python でソケット通信をやろうと思ったのですが、思った通りに出来ませんでした。やろうと思ったのは次のようなコードでした。

sendall() メソッドには str を渡すとあったので次のようにして実行したのですが、エラーになってしまいました。

import socket
 
my_socket = socket.socket()
my_socket.connect( ( "127.0.0.1", 8080 ) )
my_socket.sendall( "testdata" )
my_socket.close()

詳しい同僚に聞いたところ、Python 3 系では文字列の前に b をつけてバイト列として送る必要があるとのことでした。もし、変数に代入したのであれば encode メソッドを使って送ります。(以下では UTF-8 でエンコードしています)

import socket
 
my_socket = socket.socket()
my_socket.connect( ( "127.0.0.1", 8080 ) )
# 文字列リテラルから
my_socket.sendall( b"testdata" )
# 変数から
data = "testdata"
my_socket.sendall( data.encode( "utf-8" ) )
my_socket.close()