V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CurChen
V2EX  ›  程序员

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

  •  
  •   CurChen · 2020-03-20 10:41:57 +08:00 · 1948 次点击
    这是一个创建于 1708 天前的主题,其中的信息可能已经有所发展或是发生改变。
    当路径过长 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
    想知道这种路径叫什么,它的生成原理是什么
    9 条回复    2020-03-20 15:28:44 +08:00
    ClericPy
        1
    ClericPy  
       2020-03-20 10:54:49 +08:00
    尽早使用 pathlib

    过长的情况按理说不会有问题, 你判断的时候打印出来看看路径是不是转义了, Windows 上默认确实是用反斜杠的, 好像和 DOS 年代什么什么规范有关系
    augustheart
        2
    augustheart  
       2020-03-20 10:56:29 +08:00
    看图说话,就叫做短路径,ShortPath……
    ansi 年代的遗毒,路径最长不超过 MAX_PATH (260)
    unicode 时代 windows 路径最长可达到 32,767。但是海量的 api 依然死在了短路径上……
    from msdn,个人解释,可能有错。
    sc3263
        3
    sc3263  
       2020-03-20 11:00:09 +08:00   ❤️ 1
    这个应该是 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
        4
    xiri  
       2020-03-20 11:04:33 +08:00
    现在 windows 下安装 python 的时候,最后一步会有个提示问你是否需要解决 windows 下超过(?不记得具体数字了)的路径的问题,你点是就会自动处理
    sc3263
        5
    sc3263  
       2020-03-20 11:08:44 +08:00 via Android
    @xiri 那个貌似需要 win10 1607 及之后的系统,配合 Python 3.6 及之后的版本,才能正常处理。
    ysc3839
        6
    ysc3839  
       2020-03-20 12:56:55 +08:00 via Android
    我只知道如果使用的是 Unicode 编码的 API,可以在路径开头加上 \\?\ 来解除长文件名限制。同时楼上也提到了 Win10 某个版本开始也可以修改注册表来解除这个限制,Python 安装完就有个按钮可以自动修改这个。
    PHONE_~1 这种可能叫 8.3 兼容文件名?是为了兼容只支持 DOS 8.3 文件名的程序,会自动把长的文件名映射成短的。
    cz5424
        7
    cz5424  
       2020-03-20 15:03:24 +08:00 via iPhone
    把 Python 再装一遍就知道怎么处理了
    CurChen
        8
    CurChen  
    OP
       2020-03-20 15:24:39 +08:00
    @sc3263 非常感谢 我用了路径添加\\?\的方法 已解决问题 笔芯
    no1xsyzy
        9
    no1xsyzy  
       2020-03-20 15:28:44 +08:00
    一看就知道 Win98 的时候不玩命令行
    那时候 C:\Progra~1\ 可太常见了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1038 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:10 · PVG 07:10 · LAX 15:10 · JFK 18:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.