创建长文件时引发Python IOError异常

10 投票
5 回答
12114 浏览
提问于 2025-04-16 09:53

我在尝试用“open (fname, 'w+')”打开一个新文件时,遇到了下面的IO错误。完整的错误信息如下。

这个文件并不存在,但我用“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'

5 个回答

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()
5

这里有一些相关的代码,对我来说是有效的(我的文件名和路径都很长):

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(..)返回了一些目录当作文件,所以我在上面做了检查。

7

在Windows的应用程序接口中,路径的最大长度限制为260个字符。

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

更新:在路径前面加上"\\?\"。

撰写回答