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

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

ただいまの
回答率

88.60%

Pythonのプログラムでフォルダを圧縮し、その後それを手動解凍すると日本語名フォルダ(ファイル)が文字化けしている

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,913

yuuta123

score 10

 前提・実現したいこと

Pythonプログラミング逆引き大全 313の極意
出版社: 秀和システム (2018/4/1)

P248
自動バックアッププログラムを作成する

を、日本語フォルダを含む状態で文字化けさせずに動かしたいです。
(が、圧縮されたものを解凍してみると、日本語名フォルダ(および日本語名ファイル)について文字化けしています)

 発生している問題・エラーメッセージ

プログラムを動かすことにより圧縮対象となるフォルダ
C:\mydata
配下には、実際には以下のサブフォルダがあります。
test
テスト

該当のプログラムを動かし、プログラムが生成したzipファイルを解凍すると、日本語名フォルダ(および日本語名ファイル)の部分について以下のようにフォルダ名が文字化けしてしまいます。日本語ではない半角英字のフォルダ名は問題ありませんでした。

test
繝・せ繝・

プログラムによる圧縮・圧縮したものを解凍したのちに生成された
繝・せ繝・
という文字化けした名前のフォルダが、圧縮前は
テスト
という名前のフォルダでした。

 該当のソースコード

import zipfile, os  # zipfileとosモジュールのインポート

'''
指定されたフォルダーをZIPファイルにバックアップする関数
folder : バックアップするフォルダーのパス
'''
def save_zip(folder):
    # folderをルートディレクトリからの絶対パスにする
    folder = os.path.abspath(folder) 

    # ZIPファイル末尾に付ける連番
    number = 1   # 初期値は1

    # ①バックアップ用のZIPファイル名を作成する部分
    # ZIPファイル名を作成して、既存のバックアップ用ZIPファイル名を出力
    while True:
        # 「ベースパス_連番.zip」の形式でZIPファイル名を作る
        zip_filename = os.path.basename(folder) + '_' + str(number) + '.zip'
        # 作成したZIPファイル名を出力
        print("zip = " + zip_filename)
        # 作成した名前と同じZIPファイルが存在しなければwhileブロックを抜ける
        if not os.path.exists(zip_filename):
            break
        # ファイルが存在していれば連番を1つ増やして次のループへ進む
        number = number + 1

    # ②ZIPファイルを作成する部分
    # ZIPファイルの作成を通知
    print('Creating %s...' % (zip_filename))
    # ファイル名を指定してZIPファイルを書き換えモードで開く
    backup_zip = zipfile.ZipFile(zip_filename, 'w')

    # フォルダのツリーを巡回してファイルを圧縮する
    for foldername, subfolders, filenames in os.walk(folder):
        # 追加するファイル名を出力
        print('ZIPファイルに{}を追加します...'.format(foldername))
        # 現在のフォルダーをZIPファイルに追加する
        backup_zip.write(foldername)
        # 現在のフォルダーのファイル名のリストをループ処理
        for filename in filenames:
        # folderのベースパスに_を連結
            new_base = os.path.basename(folder) + '_'
        # ベースパス_で始まり、.zipで終わるファイル、
        # 既存のバックアップ用ZIPファイルはスキップする
            if filename.startswith(new_base) and filename.endswith('.zip'):
                continue # 次のforループに戻る
            # バックアップ用ZIPファイル以外は新規に作成したZIPファイルに追加する
            backup_zip.write(os.path.join(foldername, filename))
    # ZIPファイルをクローズ
    backup_zip.close()
    print('バックアップ完了')

# プログラムの実行ブロック
if __name__  == '__main__':
    # バックアップするフォルダーのパスを指定
    backup_folder =  'C:\\mydata'
    # ZIPファイルへのバックアップ開始
    save_zip(backup_folder)
    # キー入力まで待機
    input('終了するには何かキーを押してください。')

 試したこと

文字コードが原因かと思い、ネットでみかけた情報を若干反映させてみましたが解決できませんでした。

また、一度一括して圧縮する方法も試してみたのですが、結局はこちらの方法でも結局日本語フォルダについてのみ文字化けする同じような状態が発生し、やはり解決方法についてわかりかねている状態です。

import os, zipfile
with zipfile.ZipFile('test.zip','w') as myzip:
for folder, subfolders, files in os.walk('C:\\mydata'):
myzip.write(folder)
for file in files:
myzip.write(os.path.join(folder,file))

 補足情報(FW/ツールのバージョンなど)

Win7

import sys
sys.version_info
sys.version_info(major=3, minor=7, micro=0, releaselevel='final', serial=0)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2018/11/02 18:49

    文字化けした際はなんの解凍ソフトを使っていたのでしょうか?

    キャンセル

  • can110

    2018/11/02 18:50

    「単純に解凍の仕方がまずかった、ということでしょうか?」はい。そう考えられます。

    キャンセル

  • yuuta123

    2018/11/02 18:54

    can110さん、tiitoiさん、ありがとうございました。 解凍の問題だったということで了解しました。 大変助かりました。 tiitoiさん、 Lhaplus for Windows Version 1.74 で解凍しました。

    キャンセル

回答 1

check解決した方法

0

Pythonのコードの問題ではなく、解凍の段階での問題だったようで
Lhaplus for Windows Version 1.74
を使って解凍していたのを
7-Zip 18.05(2018-04-30) for Windows
に変えたら解決しました。

ご教示くださった方々、ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/03 00:27

    「解凍の段階での問題」というよりかは、zipフォーマットの問題だと思います。
    zipフォーマットのアーカイブ内のファイル名の文字コードは、特に決まりはありません。
    これは、pythonのマニュアルにも書かれています。
    https://docs.python.org/ja/3/library/zipfile.html#zipfile.ZipFile.write
    まぁ、DOSの頃から存在しているフォーマットなんで、仕方ありませんね…。

    というわけで、圧縮するソフトと解凍するソフトが違えば起きうる問題だと思ってください。

    キャンセル

  • 2018/11/05 12:09

    追加ご指摘ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Pythonに関する質問
  • Pythonのプログラムでフォルダを圧縮し、その後それを手動解凍すると日本語名フォルダ(ファイル)が文字化けしている