我在Raspberry Pi上运行了来自/etc/rc.local的python脚本。我的脚本运行一个Web服务器,从POST接收传入的文件名。有时这些文件名具有非ascii字符,例如õäöü。问题是如果我尝试将其写入文件,我会UnicodeEncodeError
/ UnicodeDecodeError
取决于我是否尝试将其写为bytes
或str
。
只有当我尝试从头开始运行它时才会发生这种情况,如果我进入并尝试运行它,一切都很好。
我无法打印出我想要保存的字符串,我总是得到一个UnicodeEncodeError
:'ascii'编码..错误,因为shell是在ascii中。
我保存的代码:
def save(self, filePaths):#filePaths is a list of str
playlistContents = '[playlist]\n'
playlistContents += 'NumberOfEntries='+str(len(filePaths))+'\n'
for i in range(len(filePaths)):
#if i do ascii(filePaths[i]) then I get a str which saves but obviously is wrong
playlistContents += 'File'+str((i + 1))+'='+Playlist.escapeFilePath(filePaths[i])+'\n'
fileHandler = open(self.path, 'w+')#or 'wb'
fileHandler.write(playlistContents)#if wb, then 'playlistContents.encode()'
fileHandler.close()
答案 0 :(得分:0)
默认情况下,Python假定所有文件名都是根据sys.getfilesystemencoding()
报告的设置进行编码的。但是,某些文件系统不一定强制执行此编码限制,因此al
在没有正确文件名编码的情况下创建的文件。所以你需要编码你的文件名。您可以使用以下函数执行此操作(通过 David Beazley和Brian K.Jones 更改 Python Cookbook,第3版):
def bad_filename(filename):
temp=filename.encode(sys.getfilesystemencoding(),errors='surrogateescape')
return temp.decode('latin-1')
您也可以使用repr
:
def bad_filename(filename):
return repr(filename)[1:-1]
try:
print(filename)
except UnicodeEncodeError:
print(bad_filename(filename))
sys.getfilesystemencoding()返回用于的编码名称 将Unicode文件名转换为系统文件名,如果是,则转换为None 使用系统默认编码。