Русские названия файлов в архивах на Mac

Периодически сталкиваюсь с проблемой при распаковке на Mac архивов, содержащих русские названия файлов. Если архив создавался на Windows, то почти наверняка навания будут в непонятной кодировке. Пробовал разные программы, но не одна из них не воспринимала их нормально. В итоге набросал маленький скриптик для zip-архивов, который сам распаковывает архив и исправляет кодировку названий.

Скрипт написан на коленке и приводится “как есть”. Не оптимален, но главное работает.

# conding=utf-8
import os
import shutil
import sys
import zipfile


if len(sys.argv) < 2:
    print 'Error: missed zip file'
    sys.exit(1)

zip_archive = sys.argv[1]
filename = os.path.basename(zip_archive)

path = './{0}_Folder'.format(filename)
tmp_path = './{0}_Folder_tmp'.format(filename)
try:
    if not os.path.exists(path):
        os.makedirs(path)
    if not os.path.exists(tmp_path):
        os.makedirs(tmp_path)
except (OSError, IOError):
    print 'Error create directory: {0}'.format(path)
    sys.exit(1)

try:
    with zipfile.ZipFile(zip_archive, 'r') as zfile:
        for item in zfile.namelist():
            zfile.extract(item, tmp_path)
            old_filename = '{0}/{1}'.format(tmp_path, item)
            new_filename = u'{0}/{1}'.format(path, item.decode('cp866'))
            if not os.path.exists(os.path.dirname(new_filename)):
                os.makedirs(os.path.dirname(new_filename))
            os.rename(old_filename, new_filename)
    shutil.rmtree(tmp_path)

except Exception as e:
    print u"Error open Zip file: {0}".format(zip_archive)
    import traceback
    traceback.print_exc(e)

Используйте на свой страх и риск.

 
comments powered by Disqus