Python 路径名太长,无法打开?

Python 路径名太长,无法打开?,python,windows,python-2.7,Python,Windows,Python 2.7,这是执行的屏幕截图: 如您所见,错误表明目录“JSONFiles/plant/Rent/dubizzleabaudhabiproperty”不存在 请看我的档案: 文件夹肯定在那里 更新2 代码 self.file = open("JSONFiles/"+ item["category"]+"/" + item["action"]+"/"+ item['source']+"/"+fileName + '.json', 'wb') # Create a new JSON file with t

这是执行的屏幕截图:

如您所见,错误表明目录“JSONFiles/plant/Rent/dubizzleabaudhabiproperty”不存在

请看我的档案:

文件夹肯定在那里

更新2 代码

self.file = open("JSONFiles/"+ item["category"]+"/" + item["action"]+"/"+ item['source']+"/"+fileName + '.json', 'wb') # Create a new JSON file with the name = fileName parameter
        line = json.dumps(dict(item)) # Change the item to a JSON format in one line
        self.file.write(line) # Write the item to the file
更新
当我将文件名更改为较小的文件名时,它会起作用,因此问题在于路径的长度。请问解决方法是什么?

出现此错误可能有多种原因。请确保以下各项:

  • 文件夹的父目录(JSONFiles)与Python脚本的目录相同

  • 即使文件夹存在,也不意味着单个文件存在。验证是否相同,并确保确切的文件名与Python代码试图访问的文件名匹配


  • 如果您仍然面临问题,请在您试图访问的最内层文件夹上共享“dir”命令的结果。

    常规DOS路径限制为
    MAX\u PATH
    (260)个字符,包括字符串的终止
    NUL
    字符。通过使用以
    \\?\
    前缀开头的扩展长度路径,可以超过此限制。此路径必须是完全限定的Unicode字符串,并且只能使用反斜杠作为路径分隔符。根据Microsoft的标准,最大扩展路径长度为32760个字符。单个文件或目录名最多可包含255个字符(对于UDF文件系统为127个字符)。扩展UNC路径还支持为
    \\?\UNC\server\share

    例如:

    导入操作系统
    def winapi_路径(dos_路径,编码=无):
    if(非isinstance(dos_路径,unicode)和
    编码不是无):
    dos_路径=dos_路径。解码(编码)
    path=os.path.abspath(dos\u路径)
    如果路径.startswith(u“\\\”):
    返回u“\\\?\\UNC\\\”+路径[2:]
    返回u“\\\?\\”+路径
    path=winapi\u path(os.path.join(u“JSONFiles”,
    项目[“类别”],
    项目[“行动”],
    项目[“来源”],
    文件名+“.json”))
    
    路径=winapi_路径(“C:\\Temp\\test.txt”) >>>打印路径 \\?\C:\Temp\test.txt 请参阅MSDN上的以下页面:


    背景 Windows调用NT运行时库函数rtldospathname to relativentpathname___与status将DOS路径转换为本机NT路径。如果我们
    打开上面的路径(即
    CreateFile
    )并在后一个函数上设置断点,我们可以看到它如何处理以
    \\?\
    前缀开头的路径

    断点0命中
    ntdll!RTLDOSPATHNAME与状态相关的密码名称:
    00007ff9`d1fb5880 4883ec58子rsp,58h
    0:000>du@rcx
    000000 B4`52fc0f60“\\?\C:\Temp\test.txt”
    0:000>r rdx
    rdx=000000 B450F9EC18
    0:000>pt
    ntdll!RTLDOSPATHNAME与状态为+0x66的相对端口名:
    00007ff9`d1fb58e6 c3 ret
    
    结果将用NT DOS设备前缀替换
    \\?\
    ,并将字符串复制到本机:

    0:000>dS b450f9ec18
    000000b4`536b7de0“\??\C:\Temp\test.txt”
    
    如果使用
    /?/
    而不是
    \\?\
    ,则路径仍限于
    最大路径
    个字符。如果太长,则返回状态代码
    status\u NAME\u too\u long
    (0xC0000106)

    如果对前缀使用
    \\?\
    ,但在路径的其余部分使用斜杠,Windows将不会为您将斜杠转换为反斜杠:

    断点0命中
    ntdll!RTLDOSPATHNAME与状态相关的密码名称:
    00007ff9`d1fb5880 4883ec58子rsp,58h
    0:000>du@rcx
    0000005b`c2ffbf30“\\?\C:/Temp/test.txt”
    0:000>r rdx
    rdx=000000 5BC0B3F068
    0:000>pt
    ntdll!RTLDOSPATHNAME与状态为+0x66的相对端口名:
    00007ff9`d1fb58e6 c3 ret
    0:000>dS 5bc0b3f068
    0000005b`c3066d30“\??\C:/Temp/test.txt”
    
    正斜杠是NT命名空间中的有效对象名称字符。它由Microsoft文件系统保留,但您可以在其他命名的内核对象中使用正斜杠,这些对象存储在
    \BaseNamedObjects
    \Sessions\[会话号]\BaseNamedObjects
    中。此外,我认为I/O管理器不会对设备和文件名中的保留字符强制执行该策略。这取决于设备。也许有人有一个Windows设备,它实现了一个名称空间,允许名称中的正斜杠。至少您可以创建包含正斜杠的DOS设备名称。例如:

    >kernel32=ctypes.windell('kernel32'))
    >>>内核32.DefinedDevice(0,u'My/Device',u'C:\\Temp')
    >>>存在(u'\?\\My/Device\\test.txt')
    真的
    
    您可能想知道
    \??
    意味着什么。它曾经是对象名称空间中DOS设备链接的实际目录,但从NT 5(或NT 4 w/终端服务)开始,它变成了一个虚拟前缀。对象管理器通过首先检查目录
    \Sessions\0\DosDevices\[logon\u session\u ID]
    中登录会话的DOS设备链接,然后检查
    \Global???
    目录中的系统范围DOS设备链接来处理此前缀

    请注意,前者是登录会话,而不是Windows会话。登录会话目录都位于Windows会话0(即Vista+中的服务会话)的
    DosDevices
    目录下。因此,如果您有用于非提升登录的映射驱动器,您将发现它在提升的命令提示符中不可用,因为提升的令牌实际上用于不同的登录会话

    DOS设备链接的一个示例是
    \Global???\C:
    =>
    \device\HarddiskVolume2
    。在这种情况下,DOS
    C:
    驱动器实际上是指向
    硬盘卷2
    设备的符号链接
    def winapi_path(dos_path, encoding=None):
        if (not isinstance(dos_path, str) and encoding is not None): 
            dos_path = dos_path.decode(encoding)
        path = os.path.abspath(dos_path)
        if path.startswith(u"\\\\"):
            return u"\\\\?\\UNC\\" + path[2:]
        return u"\\\\?\\" + path