大家好 想问下 py 处理长路径该怎么做

2020-03-20 10:41:57 +08:00
 CurChen
当路径过长 os.chdir() os.path.exists() 都会失效

在网上查了下 也没找到很好的解决办法

比如以下路径,文件是存在的。但是会报错:FileNotFoundError: [Errno 2] No such file or directory

D:/Phone_Log/20200319171727/temp/5/media/0/Tencent/MicroMsg/32a2f632afb199b76ace4e435859d83c/voice2/40/d7/msg_0818541229169faa6d37d68102.amr/faa4ec816b91c7f6bc98a9dab551bccd/treasure/res/box/glow2.PNG/.um/Plugin/com.tencent.mm/data/com.tencent.mm/MicroMsg/2b8d81569b20e7d5c345c0c401abe90c/xxxxxxx.db

有意思的是,把文件路径复制打开,win 会自动把路径改为

D:\PHONE_~1\202003~4\temp\5\media\0\Tencent\MicroMsg\32A2F6~1\voice2\40\d7\MSG_08~1.AMR\FAA4EC~1\treasure\res\box\glow2.PNG\UM4297~1\Plugin\COMTEN~1.MM\data\COMTEN~1.MM\MicroMsg\2B8D81~1\xxxxxxx.db
想知道这种路径叫什么,它的生成原理是什么
1833 次点击
所在节点    程序员
9 条回复
ClericPy
2020-03-20 10:54:49 +08:00
尽早使用 pathlib

过长的情况按理说不会有问题, 你判断的时候打印出来看看路径是不是转义了, Windows 上默认确实是用反斜杠的, 好像和 DOS 年代什么什么规范有关系
augustheart
2020-03-20 10:56:29 +08:00
看图说话,就叫做短路径,ShortPath……
ansi 年代的遗毒,路径最长不超过 MAX_PATH (260)
unicode 时代 windows 路径最长可达到 32,767。但是海量的 api 依然死在了短路径上……
from msdn,个人解释,可能有错。
sc3263
2020-03-20 11:00:09 +08:00
这个应该是 windows 下特有情况。相关解释可以看一下
https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation
你也可以看一下
https://qdebug.com/2019/07/31/Python3%E5%9C%A8Windows%E7%B3%BB%E7%BB%9F%E4%B8%8A%E5%AF%B9%E9%95%BF%E8%B7%AF%E5%BE%84%E7%9A%84%E6%94%AF%E6%8C%81/
之前我整理的一个文章。
想快速解决的话,可以试试把路径处理一下,所有的‘/’替换为 r‘\’,再在最前面加上 r‘\\?\’,作为新的路径,传入函数。
xiri
2020-03-20 11:04:33 +08:00
现在 windows 下安装 python 的时候,最后一步会有个提示问你是否需要解决 windows 下超过(?不记得具体数字了)的路径的问题,你点是就会自动处理
sc3263
2020-03-20 11:08:44 +08:00
@xiri 那个貌似需要 win10 1607 及之后的系统,配合 Python 3.6 及之后的版本,才能正常处理。
ysc3839
2020-03-20 12:56:55 +08:00
我只知道如果使用的是 Unicode 编码的 API,可以在路径开头加上 \\?\ 来解除长文件名限制。同时楼上也提到了 Win10 某个版本开始也可以修改注册表来解除这个限制,Python 安装完就有个按钮可以自动修改这个。
PHONE_~1 这种可能叫 8.3 兼容文件名?是为了兼容只支持 DOS 8.3 文件名的程序,会自动把长的文件名映射成短的。
cz5424
2020-03-20 15:03:24 +08:00
把 Python 再装一遍就知道怎么处理了
CurChen
2020-03-20 15:24:39 +08:00
@sc3263 非常感谢 我用了路径添加\\?\的方法 已解决问题 笔芯
no1xsyzy
2020-03-20 15:28:44 +08:00
一看就知道 Win98 的时候不玩命令行
那时候 C:\Progra~1\ 可太常见了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654486

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX