【发布时间】:2016-03-08 13:06:33
【问题描述】:
我正在尝试在 Windows 上使用 Python 中的 rmtree() 删除一些文件夹。命令失败并出现以下错误:
File "C:\Miniconda\lib\shutil.py", line 247, in rmtree rmtree(fullname, ignore_errors, onerror)
File "C:\Miniconda\lib\shutil.py", line 252, in rmtree onerror(os.remove, fullname, sys.exc_info())
File "C:\Miniconda\lib\shutil.py", line 250, in rmtree os.remove(fullname)
WindowsError: [Error 123] Die Syntax f³r den Dateinamen, Verzeichnisnamen oder die Datentrõgerbezeichnung ist falsch: 'c:\\users\\user\\appdata\\local\\temp\\tmpsh6uwz\\uClibc-.9.32\\test\\API\\pthread-RPP?TPP.SUSv4.syms'
Exception WindowsError: WindowsError(123, 'Die Syntax f\xfcr den Dateinamen, Verzeichnisnamen oder die Datentr\xe4gerbezeichnung ist falsch') in <bound method TempDir.__del__ of <tempdir.TempDir object at 0x0000000014B301D0>> ignored
错误基本上说,文件名包含 Windows 下不允许的特殊字符。那是真实的。
我怎样才能删除这些文件?
【问题讨论】:
-
传递 Unicode 文件名,看看是否有帮助。你的 Python 版本是多少?
-
@J.F.Sebastian,如果报告
WindowsError,则Python的版本早于3.3,所以它可能是Python 2.7。这意味着你可能是对的。使用字节字符串列出目录会导致 ANSI 转换,将未映射的 Unicode 字符替换为“?”。 Windows 上唯一明智的选择是确保所有文件路径都是 Unicode,因为文件系统编码是 Unicode。 -
@eryksun 请不要将 Unicode 称为“编码”。在 Python 中:
unicode_text = bytestring.decode(character_encoding)。 Unicode 不是字符编码(Unicode 字符串在内部如何表示与定义无关) -
@eryksun :API 是 Unicode:不管它是如何实现的(出于定义的目的):Unicode 不是一种编码(无论某些 Windows 编辑器可能会说什么),别这么说。
-
@FerrisGarden,Python 3 中的字符串文字是 Unicode,所以最终传递给
os.listdir的字符串是 Unicode。这将返回一个 Unicode 文件列表(来自 WinAPI Unicode APIFindFirstFileW和FindNextFileW),用于使用 Unicode APIDeleteFileW和RemoveDirectoryW删除文件和目录。一切都保持 Unicode,这避免了与系统的 ANSI 代码页之间的有损转换。在 Python 2 中,您必须小心以u''前缀的 Unicode 文字开头。
标签: python windows python-2.7