2011-02-24 64 views
3

我遇到了一个非常奇怪的错误。Python - 无效模式('w')或文件名

我有我的python脚本的代码作为我的很多功能的一部分:

url=['http://agecommunity.com/query/query.aspx?name=', name, '&md=user'] 
url=''.join(url) 
file = open("QueryESO.xml", "w") 
filehandle = urllib.urlopen(url) 
for lines in filehandle.readlines(): 
    file.write(lines) 
file.close() 

当我在怠速运转,一切都很正常。

如果我与Python(命令行)运行它,然后它给了我这个错误:

[Errno 22] invalid mode('w') or filename: 'QueryESO.xml'

在此处,它开始变得怪异: 古怪#1:我有不同的功能完全相同的代码在我的脚本中,但错误只发生在其中一个。

古怪#2:如果我修改代码,这一点,它工作正常:

url=['http://agecommunity.com/query/query.aspx?name=', name, '&md=user'] 
print url 
url=''.join(url) 
file = open("QueryESO.xml", "w") 
filehandle = urllib.urlopen(url) 
for lines in filehandle.readlines(): 
    file.write(lines) 
file.close() 

我也尝试打印网址移动到后我加入了名单,其中没有工作,我只是尝试打印“”,这也得到了前面提到的错误。

所以我想我已经找到了解决方案......但任何人都可以解释这种行为?难道我做错了什么? (那你需要我张贴,所以你可以乱整个脚本呢?)

编辑:这里是整个代码:

import urllib 
from Tkinter import * 
import tkFont 
master = Tk() 

QUERY_ESO = "QueryESO.xml" 

def QueryXML(xml, attribute): 
    x = ["<", attribute, ">"] 
    x=''.join(x) 
    z = xml.split(x, 1) 
    x = ["</", attribute, ">"] 
    x=''.join(x) 
    z=z[1] 
    z=z.split(x, 1) 
    return z[0] 

def AddFriend(): 
    nfentry = nfe2 
    name=nfentry.get() 
    url=['http://agecommunity.com/query/query.aspx?name=', name, '&md=user'] 
    url=''.join(url) 
    file = open("QueryESO.xml", "w") 
    filehandle = urllib.urlopen(url) 
    for lines in filehandle.readlines(): 
     file.write(lines) 
    file.close() 
    f = open(QUERY_ESO, "r") 
    xml = f.readlines() 
    f.close() 
    xml=''.join(xml) 
    f = open("Friends.txt", "r") 
    filestring = f.read() 
    f.close() 
    fs = filestring.split('\n') 
    if name in fs: 
     print "Friend Already Added" 
    elif xml == "<?xml version='1.0' encoding='utf-8'?><error>Failed to find user</error>": 
     print "User does not exist" 
    else: 
     fs.append(name) 
     fs = '\n'.join(fs) 
     f = open("Friends.txt", "w") 
     f.write(fs) 
     f.close() 
    nfe2.set("") 
    nfentry = nfe2 

def DeleteFriend(): 
    ofentry = ofe2 
    name=ofentry.get() 
    f = open("Friends.txt", "r") 
    filestring = f.read() 
    f.close() 
    fs = filestring.split('\n') 
    if name in fs: 
     fs.remove(name) 
     fs = '\n'.join(fs) 
     f = open("Friends.txt", "w") 
     f.write(fs) 
    ofe2.set("") 
    ofentry = ofe2 

def IsOnline(name): 
    url=['http://agecommunity.com/query/query.aspx?name=', name, '&md=user'] 
    print url 
    url=''.join(url) 
    file = open("QueryESO.xml", "w") 
    filehandle = urllib.urlopen(url) 
    for lines in filehandle.readlines(): 
     file.write(lines) 
    file.close() 
    f = open(QUERY_ESO, "r") 
    xml = f.readlines() 
    f.close() 
    xml=''.join(xml) 
    if xml == "<?xml version='1.0' encoding='utf-8'?><error>Failed to find user</error>": 
     print "User does not exist" 
    else: 
     datetime = QueryXML(xml, "LastUpdated") 
     datetime = datetime.split('T', 1) 
     time = datetime[1].split('Z', 1) 
     date = datetime[0] 
     print "User", name, "is", QueryXML(xml, "presence"), "as of", date, "at", time[0] 
     return QueryXML(xml, "presence") 

def FriendCheck(): 
    f = open("Friends.txt", "r") 
    filestring = f.read() 
    f.close() 
    fs = filestring.split('\n') 
    Laonline = Label(lowerframe, text="") 
    Laonline.grid(column=0, row=0) 
    Laonline.grid_forget() 
    x=0 
    while x <= (len(fs)-1): 
     if IsOnline(fs[x]) == "online": 
      Laonline = Label(lowerframe, text=fs[x]) 
      Laonline.grid(column=0, row=x) 
     x=x+1 

def RunTwo(Function1, Function2): 
    Function1() 
    Function2() 

def DeleteAllFriends(): 
    fs = "<?xml version='1.0' encoding='utf-8'?>\n<friends>\n</friends>" 
    f = open("Friends.txt", "w") 
    f.write(fs) 
    f.close() 
    FriendCheck() 

def DAFPop(): 
    DAFpopup = Toplevel() 
    DAFframe = Frame(DAFpopup) 
    DAFframe.grid(columnspan=4, column=0, row=0) 
    F1 = DeleteAllFriends 
    F2 = DAFpopup.destroy 
    Q1 = lambda: RunTwo(F1, F2) 
    DAFL1 = Label(DAFframe, text="This delete all of your friends. Are you sure you wish to continue?") 
    DAFL1.grid() 
    DAFOK = Button(DAFpopup, width=10, text="Yes", command=Q1) 
    DAFOK.grid(column=1, row=1) 
    DAFNO = Button(DAFpopup, width=10, text="No", command=DAFpopup.destroy) 
    DAFNO.grid(column=2, row=1) 

frame = Frame(master, bd=5) 
frame.grid() 

friendlist = Frame(frame, bd=5, width=150, height=400) 
friendlist.grid(column=0, row=0, rowspan=15) 

lon = Frame(friendlist, bd=2, width=150, height=10) 
lon.grid() 

Lonline = Label(lon, text="Friends Online") 
Lonline.grid(column=0, row=1) 
underlined = tkFont.Font(Lonline, Lonline.cget("font")) 
underlined.configure(underline=True) 
Lonline.configure(font=underlined) 

lowerframe = Frame(friendlist, bd=2, width=150, height=390) 
lowerframe.grid() 

lowerframe.grid_propagate(0) 

newfriendframe = Frame(frame, bd=2) 
newfriendframe.grid(column=1, row=0) 

nfe2 = StringVar() 
nfentry = Entry(newfriendframe, width=12, textvariable=nfe2) 
nfentry.grid() 
nfe2.set("") 
nfentry = nfe2.get() 

newfriend = Button(newfriendframe, text="Add Friend", width=10, command=AddFriend) 
newfriend.grid(column=0, row=1) 

oldfriendframe = Frame(frame, bd=2) 
oldfriendframe.grid(column=1, row=1) 

ofe2 = StringVar() 
ofentry = Entry(oldfriendframe, width=12,textvariable=ofe2) 
ofentry.grid() 
ofe2.set("") 
ofentry = ofe2.get() 

oldfriend = Button(oldfriendframe, text="Delete Friend", width=10, command=DeleteFriend) 
oldfriend.grid(column=0, row=1) 

rof = Button(frame, text="Reset List", width=10, command=DAFPop) 
rof.grid(column=1, row=2) 

update = Button(frame, text="Refresh", width=10, command=FriendCheck) 
update.grid(column=1, row=3) 

close = Button(frame, text="Exit", width=10, command=master.destroy) 
close.grid(column=1, row=4) 

master.mainloop() 

,这是不工作的功能IsOnline() ,尽管我已经在那里为我贴的代码留下了打印url,这似乎使它在90%的时间内没有错误地运行,而如果没有它,它会在100%的时间内得到错误。

它也具有相关的文本文件,Friends.txt:

zorc17 
WilliamWallace30 
Sir_Constantin 
jerom_the_brave 
elvarg_flame 
refinedchaos 
Metis 
Lancener 
Neverseperat 
musketeer925 
maxulino 
Zack_iz_Weird 
StormComing 

这似乎创造QueryESO.xml对我蛮好,即使它不存在(当它不出现错误, 当然)。如果不是这种情况,名为QueryESO.xml的空白文件将正常工作,因为它从网页获取其内容。

“刷新”按钮是其中存在错误的按钮。

+4

'file'是Python中内置文件类型的名称;重写它被认为是不好的做法。 – katrielalex 2011-02-24 22:01:29

+0

代码实际上自己指定“QueryESO.xml”,对吗? (前面没有路径/目录?) – user470379 2011-02-24 22:16:08

+0

我发布的代码正是我脚本中的代码...所以前面没有任何路径或目录。这是有效的,因为该文件位于相同的目录中(对吗?)。 和@katrielalex: 我一定会改变它覆盖内置的文件名。 – 2011-02-24 22:52:04

回答

3

一些观察:

(1)如果该问题是在实际文件名无效字符,这将是从错误消息明显;见下图:

>>> open('fu\x01bar', 'w') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] invalid mode ('w') or filename: 'fu\x01bar' 

(2)你说你正在使用的文件名一个全局常量,但也有两次出现的文字文本的(在功能AddFriend和IsOnline) - 它帮助,如果你做确保您发布的代码实际上是您运行的代码。

(3)这种“工作90%的时间”行为的一个原因是扩展(例如,tkinter)没有处理异常,然后当别的东西检查错误时弹出。请注意,对于errorno 22,Windows只报告“发生了某种恶行”,并且Python必须发出“哦,在这种情况下,模式必须错误,或者文件路径必须是错误的”错误消息。 (4)我不是一个摆脱困惑的人,但是:在两个地方你从网上得到结果,把它们写到这个文件中,然后读回来 - 为什么?你为什么不直接在内存中使用Web结果?

+1

......我真的不知道我为什么这么做。我没有一个合法的理由。我只是让它工作。有时候我只是没有想到这些东西;这真的只是我写的第三个合法的程序,所以我有点新手。我会试着从内存中读取结果。 – 2011-02-26 15:20:46

+0

我这样做,原因是我上传一个文件调整大小,然后上传到s3亚马逊。我收到了同样的错误。 http://stackoverflow.com/questions/17467967/invalid-filename-or-mode-wb – Sohaib 2013-07-04 11:07:48

+0

我遇到同样的问题,也“工作90%的时间”。我将命令行的输出记录到文件中。我创建了几个文件来记录不同命令的输出。我想这可能是问题发生的原因。 – 2014-02-13 21:54:21

0

由于'w'是一个有效的模式,问题在于文件名。也许你在一个上下文中不使用相同的系统编码。如果它只在一个函数中,那么在这个文件名实例中可能有一些隐藏字符。解决这个问题的第一步是将文件名设置为模块级常量。

+0

我将文件名改为一个常量,但它仍然存在,因为它不在一个模块中工作,而它仍然在其他模块中工作。 它只是困扰我为什么简单地列印名单,网址,修复问题。 – 2011-02-24 23:05:41

+0

@user好吧,这可能是因为它引入了延迟,或者是因为它导致某种I/O缓冲区刷新,或者类似的,我猜。如果你进行“睡眠(1)”而不是打印,会发生什么? ('进口时间'第一...) – 2011-02-25 15:05:54

+0

@Matt呃...我现在试着用睡觉,当我把睡眠(1),它给了我错误,NameError:全球名称'睡眠'不是定义,我也试过time.sleep(1),它告诉我:UnboundLocalError:赋值之前引用的局部变量'time'。 我没有导入时间...当在另一个文件中使用导入时间和time.sleep(1)时,它工作正常......我不确定我在做什么错了? – 2011-02-25 16:10:27

相关问题