Windows上Python中的长路径
在Windows下运行Python编程时,我遇到了一个问题。我需要处理长度超过256个字符的文件路径。 现在,我基本上已经阅读了两种解决方案:Windows上Python中的长路径,python,windows,Python,Windows,在Windows下运行Python编程时,我遇到了一个问题。我需要处理长度超过256个字符的文件路径。 现在,我基本上已经阅读了两种解决方案: 使用kernel32.dll中的GetShortPathName并以这种方式访问文件 这很好,但我不能使用它,因为我需要以某种方式使用路径 shutil.rmtree(short_path) 其中短路径是非常短的路径(类似于D:\tools\Eclipse),长路径出现在目录本身(该死的Eclipse插件) 将“\\\\?\\”前置到路径 我还没有设法
shutil.rmtree(short_path)
其中短路径是非常短的路径(类似于D:\tools\Eclipse
),长路径出现在目录本身(该死的Eclipse插件)
“\\\\?\\”
前置到路径WindowsError:[error 123]文件名、目录名或卷标语法不正确:
所以我的问题是:我如何让第二个选项起作用?我强调,我需要以选项1中的示例相同的方式使用它
或
还有别的办法吗
编辑:我需要在Python2.7中工作的解决方案
EDIT2:这个问题的答案确实带有“魔法前缀”,我在这个问题中说我知道它。我不知道的是我如何使用它。我曾尝试将其预先写入路径,但正如我在上面所写的那样,它失败了。看来,像往常一样,在我认真询问某人之后的二十分钟,我找到了困扰我一周的问题的答案 因此,我发现我需要确保两件事正确完成:
/*.
,这是一个正斜杠,这是不好的希望至少有人会觉得这很有用。让我简化一下,让大家都能找到一个直截了当的答案:
u
如u'C:\\Path\\to\\file'
\\\\\?\\\
开头(转义为\\\?\
),如u'\\\?\\C:\\Path\\to\\file'
/
-->\\
# Fix long path access:
import ntpath
ntpath.realpath = ntpath.abspath
# Fix long path access.
在我的例子中,这解决了从长路径运行脚本的问题。
()
但这并不是一个普遍的解决办法。
看起来ntpath.realpath实现有问题。此代码将其替换为一个伪代码。的可能重复项。它前面有一个不同的字符串。你试过使用那个字符串吗?@Pureferret是的,但我不能接受的答案是:D我这里的字符串与那里的字符串相同,但是这个字符串被转义了。另外,这是一个使用kernal32.dll的解决方案,不确定你是否见过这个版本:所以你尝试了
“\\?\”
而且不仅仅是“\\\\?\”
?@Pureferret:1:是的,我看到了,这不是我需要的。如果我走了很长的路,我又回到了原来的位置。路径太长,Python无法使用。第二:什么D我在为\\?\添加字符串,我在问题中所写的内容刚刚被转义。@Pureferret Lol:D感谢文化的丰富,我在上述第2期之前从未听说过橡皮鸭调试,似乎您没有使用unicode
路径,即u'\\\'.join([ur'\?',path.decode('mbcs'))
。Python将\*.
附加到unicode
路径,将/*.*.
附加到字节字符串路径。通过添加尾随的\
它只是附加*.
,但您仍然在调用ANSI APIFindFirstFileA
,限制为MAX\u PATH
个字符。有关详细信息,请阅读文档。在lpFileName
的描述中,它直接告诉您需要使用Unicode([W]ide字符)版本的函数,即FindFirstFileW
(名称在“需求”中)。在大多数情况下,Python在传递unicode
参数时使用Windows范围的字符API,特别是在操作系统模块中。@HarryJohnston,如果您不熟悉Python 2.x,字符串文字是str
字节字符串,除非前缀是u
,以创建unicode
实例。连接str
和unicode
使用默认的ASCII编码来解码str
实例,因此如果short\u path
是unicode
,则在前面加上“\\\\?\\”
将导致unicode
;否则它将创建一个新的str
。OP应该在u'\\\\?\\'
前面加上前缀。另外,请阅读以了解posix\u listdir
中的PyArg\u ParseTuple
调用发生了什么情况。为了增加我的经验,我遇到了与OP相同的问题。尾随斜杠对我没有帮助,但转换为unicode类型的字符串对我有帮助。虽然此代码可以解决OP的问题,最好包括关于代码如何解决OP问题的解释。通过这种方式,未来的访问者可以从您的帖子中学习,并将其应用到自己的代码中。因此,它不是一种编码服务,而是一种知识资源。此外,高质量、完整的答案更有可能被提升。这些特性,以及所有帖子都是独立的要求,是SO作为一个平台的一些优势,使其区别于论坛。您可以进行编辑以添加信息和/或使用引用和到源文档的链接来补充您的解释注意:条目#1特定于Python 2,在您编写此答案时不再支持它。在Python3中,它只需要是str
(不需要特殊前缀来生成str
literal)。