Python 3.2将unicode字符保存到后台程序的文件中

时间:2015-01-29 18:51:21

标签: python unicode

我在Raspberry Pi上运行了来自/etc/rc.local的python脚本。我的脚本运行一个Web服务器,从POST接收传入的文件名。有时这些文件名具有非ascii字符,例如õäöü。问题是如果我尝试将其写入文件,我会UnicodeEncodeError / UnicodeDecodeError取决于我是否尝试将其写为bytesstr

只有当我尝试从头开始运行它时才会发生这种情况,如果我进入并尝试运行它,一切都很好。

我无法打印出我想要保存的字符串,我总是得到一个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()

1 个答案:

答案 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   使用系统默认编码。