2011-01-13 53 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()