2011-01-13 56 views
8

尝试使用“open(fname,'w +')”打开新文件时,出现下面显示的IOError。完整的错误信息如下。创建长文件时发生Python IOError异常

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

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

错误消息:

IOError: [Errno 2] No such file or directory: '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'

+0

谢谢。限制超过260个字符。 MSDN文章提到,我们可以使用“\\?\”作为长文件名的前缀,只是好奇,如果有人知道我可以如何将前缀添加到文件名。当我尝试执行简单的“+”操作时,在扫描单引号字符串时出现错误EOL。 (fname ='\\?\'+ fname) – AshD 2011-01-13 19:46:54

+0

使用“\\\\?\\”。原始字符串在这种情况下不起作用。 – cgohlke 2011-01-13 20:11:20

+0

改为使用正斜杠。另请参阅http://stackoverflow.com/faq#howtoask – Johnsyweb 2011-01-13 20:55:58

回答

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 

使用raw strings为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. 
3

下面是一些相关的代码,这对我的工作(我有很长的文件名和路径):

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(..)返回一些目录的文件,所以上面我检查那个。

4

可以猴修补tar文件模块与此:

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