我只是在我的系统上设置了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>
答案 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)