Wenn Sie eine Zip-Datei unter Mac-> Windows (japanische Umgebung) übergeben, bleibt der Zeichencode des Dateinamens bei der Standard-Zip-Komprimierung von Mac utf-8, und beim Dekomprimieren mit Windows treten verstümmelte Zeichen auf. Es ist möglich, Software wie MacWinZip zu installieren, um sie zu komprimieren, damit dies nicht geschieht, aber die Installation ist etwas mühsam. Also habe ich ein Zip-Komprimierungsskript für Windows erstellt, das unter Python 2.7 ausgeführt wird.
Mit OSX Yosemite, das ich verwende, können unter Windows erstellte Zip-Dateien problemlos dekomprimiert werden. In Umgebungen wie Linux kann der sjis-Dateiname jedoch verstümmelt sein. Ändern Sie in diesem Fall den Dateinamen. Verwenden Sie ein Skript, das in utf-8 geändert und dekomprimiert wird (Beispiel für ein Dekomprimierungsskript).
$ python win_zip.py <Der Pfad des Ordners, den Sie komprimieren möchten>
__ Code (win_zip.py) __
# coding:utf-8
import os, sys, zipfile, shutil
from unicodedata import normalize
def mac_path_to_sjis(mac_path):
#Das Problem ist gelöst, weil der Dateiname von mac trübe Punkte geteilt hat.
#Wenn Sie dies nicht tun, erhalten Sie eine Ausnahme, bei der die Trübung nicht in sjis geändert werden kann.
norm_path = normalize('NFC', unicode(mac_path,'utf8'))
return norm_path.encode('sjis')
def check_yes_no(message):
# raw_input returns the empty string for "enter"
yes = set(['yes','y'])
no = set(['no','n'])
choice = raw_input(message + os.linesep).lower()
if choice in yes:
return True
elif choice in no:
return False
else:
print "Please respond with 'yes' or 'no'"
return check_yes_no(message) # loop
def zip_dir(in_dir_path):
in_parent_path, in_dirname = os.path.split(in_dir_path)
os.chdir(in_parent_path)
with zipfile.ZipFile(in_dirname + '.zip', 'w') as zip_file:
for parent_path, dirs, files in os.walk(in_dirname):
sjis_dir_path = mac_path_to_sjis(parent_path)
os.makedirs(sjis_dir_path)
for fname in files:
if fname[0] == '.': continue # ignore all secret file
file_path = os.sep.join((parent_path, fname)) # path of original file
print 'zipping : {0}'.format(file_path)
sjis_file_path = mac_path_to_sjis(file_path)
if file_path == sjis_file_path:
zip_file.write(file_path) # file name is all alphabet
else:
shutil.copyfile(file_path, sjis_file_path) # copy file in sjis file name
zip_file.write(sjis_file_path)
os.remove(sjis_file_path) # remove sjis format file
# remove parent folder in sjis format
os.removedirs(sjis_dir_path)
if __name__ == '__main__':
if len(sys.argv) != 2:
sys.exit('Only 1 argument(path of directory) has to be specified as argument!')
zip_target_path = sys.argv[1]
if os.path.exists(zip_target_path) == False:
sys.exit('Directory {0} does not exists!'.format(zip_target_path))
if zip_target_path.endswith(os.sep):
zip_target_path = zip_target_path[0:-1] # remove seperator
zip_path = zip_target_path + '.zip'
if os.path.exists(zip_path):
if check_yes_no('Zip file already exists. Do you want to replace? [y/n]') == False:
print 'Bye'
sys.exit()
zip_dir(zip_target_path)
Wenn Sie Probleme oder Verbesserungen haben, zögern Sie bitte nicht, uns dies mitzuteilen.