9

尝试使用“open (fname, 'w+')”打开新文件时,出现如下所示的 IOError。完整的错误信息如下。

该文件不存在,但我使用“os.access(dir_name, os.W_OK)”和“os.path.exists (dir_name)”验证该文件的父目录确实存在。

我想知道文件名对于 Windows 是否太长,或者我做错了什么。任何提示将不胜感激。非常感谢。

错误信息:

IOError: [Errno 2] 没有这样的文件或目录:'C:\Documents and Settings\Administrator\op_models\Corp_Network_Nov12\abcde_corporate_nov_12.project\abcde_corporate_nov_12-ctr.rptd.dir\ctr\Non Business Hours for Weeknights\hourly_data_for_2_weeks\1294897740\ json.data\Link\0\Link Utilization\analyzer393146160-data0.js'

4

5 回答 5

7

在 Windows API 中,最大路径长度限制为 260 个字符。

http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx

更新:在路径前添加“\\?\”。

于 2011-01-13T06:07:20.910 回答
4

您可以使用以下方法修补 tarfile 模块:

import tarfile

def monkey_patch_tarfile():
    import os
    import sys
    if sys.platform not in ['cygwin', 'win32']:
        return
    def long_open(name, *args, **kwargs):
    # http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx#maxpath
        if len(name) >= 200:
            if not os.path.isabs(name):
                name = os.path.join(os.getcwd(), name)
            name = "\\\\?\\" + os.path.normpath(name)
        return long_open.bltn_open(name, *args, **kwargs)
    long_open.bltn_open = tarfile.bltn_open
    tarfile.bltn_open = long_open

monkey_patch_tarfile()
于 2013-10-18T08:43:28.697 回答
4

这是一些对我有用的相关代码(我有很长的文件名和路径):

for d in os.walk(os.getcwd()):
    dirname = d[0]
    files = d[2]
    for f in files:
        long_fname = u"\\\\?\\" + os.getcwd() + u"\\" + dirname + u"\\" + f
        if op.isdir(long_fname):
            continue
        fin = open(long_fname, 'rb')
        ...

请注意,对我而言,它仅适用于以下所有内容的组合:

  1. 在前面添加 '\\?\'。

  2. 使用完整路径,而不是相对路径。

  3. 仅使用反斜杠。

  4. 在 Python 中,文件名字符串必须是 unicode 字符串,例如 u"abc",而不是 "abc"。

另请注意,由于某种原因,os.walk(..)将某些目录作为文件返回,因此在上面我检查了这一点。

于 2012-11-04T04:02:04.653 回答
0

如果不是文件名的长度,就是文件名的内容...

Python 将 '\12' 视为控制序列。

>>> fn='C:\Documents and Settings\Administrator\op_models\Corp_Network_Nov12\abcde_corporate_nov_12.project\abcde_corporate_nov_12-ctr.rptd.dir\ctr\Non Business Hours for Weeknights\hourly_data_for_2_weeks\1294897740\json.data\Link\0\Link Utilization\analyzer393146160-data0.js'
>>> print fn
C:\Documents and Settings\Administrator\op_models\Corp_Network_Nov12bcde_corporate_nov_12.projectbcde_corporate_nov_12-ctr.rptd.dir\ctr\Non Business Hours for Weeknights\hourly_data_for_2_weeks
94897740\json.data\Link\Link Utilizationnalyzer393146160-data0.js

使用Windows 文件名的原始字符串将有助于:

>>> fn=r'C:\Documents and Settings\Administrator\op_models\Corp_Network_Nov12\abcde_corporate_nov_12.project\abcde_corporate_nov_12-ctr.rptd.dir\ctr\Non Business Hours for Weeknights\hourly_data_for_2_weeks\1294897740\json.data\Link\0\Link Utilization\analyzer393146160-data0.js'
>>> print fn
C:\Documents and Settings\Administrator\op_models\Corp_Network_Nov12\abcde_corporate_nov_12.project\abcde_corporate_nov_12-ctr.rptd.dir\ctr\Non Business Hours for Weeknights\hourly_data_for_2_weeks\1294897740\json.data\Link\0\Link Utilization\analyzer393146160-data0.js

更新

或者,使用正斜杠“/”而不是反斜杠“\”,因为它们适用于所有操作系统,并且可以在路径名末尾使用反斜杠为您省去麻烦,就像您在评论中一样。

另请参阅os.path.join()

更新 2

问题的简化演示:

>>> open('.\12\n\r\file.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: '.\n\n\r\x0cile.txt'
>>> open('./12/n/r/file.txt')
<open file './12/n/r/file.txt', mode 'r' at 0x7ff83f98>

C:\Users\johnysweb>copy .\12\n\r\file.txt con
Blah
        1 file(s) copied.
于 2011-01-13T06:11:45.680 回答
0

检查整个路径的长度,然后附加必要的 Windows 长路径格式。应该注意的是,这不适用于从远程目录访问数据,即以 '\\some_remote_location\..' 开头的路径,因此您需要在本地映射该目录才能使“长路径”工作。

if len(path_and_file) > 250: #I think the max is 260 but I left a buffer :)
    path_and_file = '\\\\?\\'+path_and_file
于 2019-03-14T18:33:29.750 回答