尝试使用“open(fname,'w +')”打开新文件时,会出现如下所示的IOError。完整的错误消息如下。
该文件不存在,但我使用“os.access(dir_name,os.W_OK)”和“os.path.exists(dir_name)”验证了该文件的父目录是否存在。
我想知道Windows的文件名是否太长,或者我做错了什么。任何提示将不胜感激。非常感谢你。
错误讯息:
IOError:[Errno 2]没有这样的文件或目录:'C:\ Documents and 设置\管理\ op_models \ Corp_Network_Nov12 \ abcde_corporate_nov_12.project \ abcde_corporate_nov_12-ctr.rptd.dir \ CTR \非 营业时间 周一至周五晚上\ hourly_data_for_2_weeks \ 1294897740 \ json.data \链接\ 0 \链接 利用\ analyzer393146160-data0.js'
答案 0 :(得分:7)
在Windows API中,最大路径长度限制为260个字符。
http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx
更新:在路径前加上“\\?\”。
答案 1 :(得分: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()
答案 2 :(得分: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')
...
请注意,对我而言,它只能使用以下所有内容的组合:
在前面添加'\\?\'。
使用完整路径,而不是相对路径。
仅使用反斜杠。
在Python中,文件名字符串必须是unicode字符串,例如u“abc”,而不是“abc”。
另请注意,由于某些原因os.walk(..)
将某些目录作为文件返回,所以上面我检查了。
答案 3 :(得分: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
<强>更新强>
或者,使用正斜杠'/'代替反斜杠'\',因为它们可以在所有操作系统上运行,并且可以像在注释中一样在路径名末尾使用反斜杠来节省麻烦。
更新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.
答案 4 :(得分:0)
检查整个路径的长度,然后附加必要的Windows长路径格式。请注意,这不适用于从远程目录访问数据,即以'\\ some_remote_location \ ..'开头的路径,因此您将需要在本地映射该目录以使“长路径”起作用。 / p>
if len(path_and_file) > 250: #I think the max is 260 but I left a buffer :)
path_and_file = '\\\\?\\'+path_and_file