Windows上的Python中的长路径

Jiř*_*tor 14 python windows

在使用Windows运行的Python编程时遇到问题.我需要使用超过256或whatsathelimit字符的文件路径.现在,我基本上阅读了两个解决方案:

  1. 使用kernel32.dll中的GetShortPathName并以这种方式访问​​该文件.

这很好,但我不能使用它,因为我需要以某种方式使用路径

shutil.rmtree(short_path)
Run Code Online (Sandbox Code Playgroud)

其中short_path是一个非常短的路径(类似的东西D:\tools\Eclipse),长路径出现在目录本身(该死的Eclipse插件).

  1. 前面"\\\\?\\"的路径

我没有设法以任何方式完成这项工作.以这种方式做任何事情的尝试总是会导致错误WindowsError: [Error 123] The filename, directory name, or volume label syntax is incorrect: <path here>

所以我的问题是:如何让第二个选项工作?我强调我需要以与选项#1中的示例相同的方式使用它.

要么

还有其他方法吗?

编辑:我需要解决方案在Python 2.7中工作

编辑2:在Windows打破Python长文件名支持的问题确实给出了"魔术前缀"的答案,我说我在这个问题中知道它.我不知道的是我如何使用它.我已经尝试将其添加到路径中,但它只是失败了,正如我上面所写的那样.

Jiř*_*tor 13

嗯,似乎一如既往,我已经找到了答案,在我认真询问有关人员的情况后,我在20分钟内一直困扰着我.

所以我发现我需要确保正确完成两件事:

  1. 路径只能包含反斜杠,不能包含正斜杠.
  2. 如果我想做列出目录的事情,我需要用反斜杠结束路径,否则Python会附加/*.*到它,这是一个正斜杠,这是不好的.

希望至少有人会觉得这很有用.

  • @Pureferret 哈哈 :D 感谢您的文化丰富,我以前从未听说过橡皮鸭调试 (2认同)
  • 鉴于上面的问题 2,您似乎没有使用 `unicode` 路径,即 `u'\\'.join([ur'\\?', path.decode('mbcs')])`。Python 将“\*.*”附加到“unicode”路径,将“/*.*”附加到字节字符串路径。通过添加尾部“\”,它仅附加“*.*”,但您仍然调用 ANSI API“FindFirstFileA”,并限制“MAX_PATH”字符。 (2认同)
  • @HarryJohnston,如果你不熟悉Python 2.x,字符串文字是`str`字节字符串,除非前缀为`u`以创建`unicode`实例.连接`str`和`unicode`使用默认的ASCII编码来解码`str`实例,所以如果`short_path`是`unicode`,则前缀''\\\\?\\'`会产生`unicode`; 否则它会创建一个新的`str`.OP应该在'u'\\\\?\\'`前面加上.另外,阅读[解析参数和构建值](https://docs.python.org/2/c-api/arg.html)以了解在`posix_listdir`中使用`PyArg_ParseTuple`调用的情况. (2认同)
  • 只是为了增加我的经验,我遇到了与OP相同的问题.尾部斜杠对我没有帮助,但转换为unicode类型的字符串. (2认同)

小智 5

让我为任何寻求直接答案的人简化一下:

  1. 路径需要是 unicode,在字符串前面加上uu'C:\\path\\to\\file'
  2. 路径需要以\\\\?\\(转义为\\?\)开头,例如u'\\\\?\\C:\\path\\to\\file'
  3. 没有正斜杠只有反斜杠:/-->\\
  4. 它必须是绝对路径;它不适用于相对路径

  • 注意:项目 #1 特定于 Python 2,在您撰写此答案时不再支持 Python 2。在Python 3中,它只需要是“str”(不需要特殊的前缀来创建“str”文字)。 (2认同)