在Windows中读取日文文件名,使用Python和glob无法正常工作

时间:2010-06-20 00:31:30

标签: python windows unicode directory

我只是在我的系统上设置了PortablePython,所以我可以从PHP运行python脚本,我得到一些非常基本的代码(下面)列出目录中的所有文件,但是它不能用于日文文件名。它适用于英文文件名,但是当我在目录中放入包含日文字符的任何文件时,它会发出错误(下面)。

import os, glob

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

使用'PyScripter-Portable.exe'可以正常工作,但是当我尝试在命令提示符或PHP中运行'PortablePython \ App \ python.exe“test.py”'时,会发出以下错误:

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问题而无法在Windows中读取unicode文件名...所以我真的需要这个工作 - 你能给我的任何帮助都会很棒。< / p>

3 个答案:

答案 0 :(得分:2)

问题可能是您要打印的输出目标不使用与文件系统相同的编码。一般规则是您应该尽快将文本转换为Unicode,然后转换为输出时所需的任何字节编码(例如utf-8)。

由于您正在处理文件名,因此它们应该采用系统编码。

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

现在你的所有文件名都是Unicode,你需要找出从命令提示符输出的正确编码(或者你可以使用u标志启动Unicode版本的命令提示符:“cmd /u” )

答案 1 :(得分:1)

假设您正在使用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文件名。

答案 2 :(得分:0)

示例加载路径中带有 unicode 符号的文件:

from glob import glob
import librosa

#File has chanies in path

#Find all wav-s
replays_files = glob('<you-path>/**/*.wav', recursive=True)

s = replays_files[1478]
#Will be something like this:
#'<you-path>\udde6\uabae\udc9a\udce4_audio.wav'


#If you try load
librosa.core.load(s,sr=16000,mono=True)
#UnicodeEncodeError: 'ascii' codec can't encode characters in position 222-242: ordinal not in range(128)

#Replace udde6\ 
s = s.encode('ascii','surrogateescape').decode()

#Still doesn't working
librosa.core.load(s,sr=16000,mono=True)
#UnicodeEncodeError: 'ascii' codec can't encode characters in position 222-228: ordinal not in range(128)

s = s.encode('utf-8')
#b'<you-path>\xe6\xbe\x7a\xe4\xb8_audio.was'

#Work
librosa.core.load(s,sr=16000,mono=True)