Чтение японских имен файлов в Windows с использованием Python и glob не работает - PullRequest
0 голосов
/ 20 июня 2010

Я просто установил PortablePython в своей системе, чтобы я мог запускать скрипты Python из PHP, и я получил некоторый очень базовый код (ниже), чтобы вывести список всех файлов в каталоге, однако он не работает с японскими именами файлов.Он отлично работает с английскими именами файлов, но выдает ошибки (ниже), когда я помещаю любой файл, содержащий японские символы, в каталог.

import os, glob

path = 'G:\path'
for infile in glob.glob( os.path.join(path, '*') ):
    print("current file is: ", infile)

Работает нормально, используя 'PyScripter-Portable.exe', однако, когда я пытаюсь запустить 'PortablePython \ App \ python.exe "test.py"' ​​в командной строке или из PHP, он плюетследующие ошибки:

current file is:  Traceback (most recent call last):
  File "test.py", line 5, in <module>
    print("current file is: ", infile)
  File "PortablePython\App\lib\io.py", line 1494, in write
    b = encoder.encode(s)
  File "PortablePython\App\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 37-40: character maps to <undefined>

Я очень плохо знаком с Python и просто использую это, чтобы обойти проблему с PHP, так как я не могу читать имена файлов в кодировке Unicode в Windows ... Так что мне действительно нужно, чтобы это работало - любая помощь, которую вы можете мне дать, была бы полезна.

Ответы [ 2 ]

2 голосов
/ 20 июня 2010

Возможно, проблема в том, что независимо от того, в каком месте назначения вы печатаете, кодировка не совпадает с кодировкой файловой системы.Общее правило заключается в том, что вы должны получить текст в Unicode как можно скорее, а затем преобразовать его в любую байтовую кодировку, которая вам нужна при выводе (например, utf-8).быть в системной кодировке.

import sys
fse = sys.getfilesystemencoding()
filenames = [unicode(x, fse) for x in glob.glob( os.path.join(path, '*') )]

Теперь все ваши имена файлов являются Unicode, и вам нужно выяснить правильную кодировку для вывода из командной строки или что-либо еще (вы можете запустить версию командной строки Unicodeс флагом u: "cmd /u")

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

Если вы используете Python 2.x, попробуйте изменить строки на Unicode, например:

path = u'G:\path'
for infile in glob.glob( os.path.join(path, u'*') ):
    print( u"current file is: ", infile)

Это должно сообщить функциям, связанным с файловой системой python, о том, что вы хотите работать с именами файлов в кодировке Unicode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...