Python не открывает японские имена файлов - PullRequest
3 голосов
/ 22 июня 2010

Я работал над сценарием Python, чтобы открыть файл с именем Unicode (в основном на японском языке) и сохранить его в случайно сгенерированном (не Unicode) имени файла в 64-битной Windows Vista, и у меня возникли проблемы... Он просто не работает, он отлично работает с именами файлов, отличными от Юникода (даже если в нем есть контент в формате Юникод), но в секунду, когда вы пытаетесь передать имя файла в кодировке Юникод, - он не работает.Вот код:

try:
    import sys, os
    inpath = sys.argv[1]
    outpath = sys.argv[2]
    filein = open(inpath, "rb")
    contents = filein.read()
    fileSave = open(outpath, "wb")
    fileSave.write(contents)
    fileSave.close()

    testfile = open(outpath + '.test', 'wb')
    testfile.write(inpath)
    testfile.close()

except:
    errlog = open('G:\\log.txt', 'w')
    errlog.write(str(sys.exc_info()))
    errlog.close()

И ошибка:

(<type 'exceptions.IOError'>, IOError(2, 'No such file or directory'), <traceback object at 0x01092A30>)

Ответы [ 2 ]

3 голосов
/ 22 июня 2010

Вы должны конвертировать inpath в Unicode, например:

inpath = sys.argv[1]
inpath = inpath.decode("UTF-8")
filein = open(inpath, "rb")

Я предполагаю, что вы используете Python 2.6, потому что в Python 3 все строки по умолчанию имеют Unicode, поэтому такой проблемы не будет.

1 голос
/ 22 июня 2010

Я предполагаю, что sys.argv 1 и sys.argv [2] являются просто байтовыми массивами и не поддерживают изначально Unicode. Вы можете подтвердить это, напечатав их и увидев, ожидают ли они того персонажа. Вы также должны напечатать тип (sys.argv 1 ), чтобы убедиться, что они имеют правильный тип.

Откуда берутся параметры командной строки? Они приходят из другой программы или вы набираете их в командной строке? Если они приходят из другой программы, вы можете сделать так, чтобы другая программа кодировала их в UTF-8, а затем ваша программа на Python декодировала их из UTF-8.

Какую версию Python вы используете?

Редактировать: вот надежное решение: http://code.activestate.com/recipes/572200/

...