当尝试执行单独的操作来打开另一个程序中的文件,关闭另一个程序中的文件并执行系统操作(例如,基于unicode的文件名上的复制文件)时,遇到以下错误。我当前的代码在Macintosh上运行良好,但在Windows上却无法正常运行。我刚刚开始使用Unicode文件名和CLI。
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0301' in position 5: ordinal not in range(128)
另一个应用程序示例中的简化关闭文件如下所示:
def CloseFile( fileToClose ):
cmd = [ 'sudo', fmsadmin, 'close', fileToClose, '-u', 'userName', '-p', 'accountName', '-y' ]
subprocess.check_output( cmd )
CloseFile( u'ÉürøFile.fmp12' )
我曾尝试在设置cmd变量之前执行解码,但是这不起作用。
fileToClose = fileToClose.decode('utf-8')
如果您愿意的话,我可以给您一个CopyFile()示例,但是在调用命令之前,此错误很明显。因此,您不需要安装FileMaker Server即可重现该问题。
我正在使用shutil.copy(from,to)作为复制方法。
答案 0 :(得分:0)
好的...我终于弄清楚了,将在下面提供警告。我已经从另一个程序复制并粘贴了文件名。
此文件名中的前两个字符未合并(ÉürøFile.fmp12)。因此它被编码为E´和u¨。代替É和ü。显然,在尝试基于该文件名执行命令行时,Python 2.7无法处理未合并的字符。
所以这里的警告是:
作为此问题的后续,我发现了另一个问题。更正了上面的代码后,我正尝试使用Python的内置zip实用程序来保护unicode文件名。将文件存储在zip文件中,然后在需要时使用unicode文件名解压缩文件。这显然是Windows上的Python 2.7中的错误。当内置解压缩实用程序的Python解压缩文件时,它弄乱了磁盘上文件名的编码(在Mac上运行正常)。该名称在Windows上变得微不足道,并且未被系统实用程序(例如,使用copy,mv,getSize等)识别。我的解决方法是将带有欧洲名称和亚洲名称的松散测试文件放在SMB卷上的文件夹中,并让我的代码工作直接在他们身上。更多的经验教训。我希望将来可以使用Python 3,并且基于文件的问题更少。