Python - mode non valide ("w") ou un nom de fichier
J'ai rencontré un très étrange erreur.
J'ai ce code dans le cadre de plusieurs de mes fonctions dans mon script 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()
Quand je le lance dans le vide, tout fonctionne très bien.
Si je le lance avec Python (Ligne de Commande), puis il me donne cette erreur:
[Errno 22] mode non valide ("w") ou un nom de fichier: 'QueryESO.xml'
Voici où ça commence à devenir bizarre:
Bizarre #1: j'ai exactement le même code dans des fonctions différentes dans mon script, mais l'erreur ne se produit que pour l'un d'entre eux.
Bizarre #2: Si je change le code, il fonctionne très bien:
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()
J'ai aussi essayé de déplacer l'impression url après, j'ai rejoint la liste, ce qui n'a pas fonctionné, et j'ai juste essayé d'impression "", qui a également obtenu le mentionné précédemment erreur.
Donc je suppose que j'ai trouvé une solution... mais quelqu'un peut expliquer ce comportement? Suis-je en train de faire quelque chose de mal? (Et vous avez besoin de moi de publier la totalité du script de sorte que vous pouvez jouer avec ça?)
EDIT: Voici le code entier:
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()
Et la fonction qui ne fonctionne pas est IsOnline(), bien que j'ai laissé l'impression d'url pour le code que j'ai posté, ce qui semble pour le garder en cours d'exécution sans erreur 90% du temps, alors que sans cela, il obtient l'erreur de 100% du temps.
Il dispose également d'une dépendance de fichier texte, Friends.txt:
zorc17
WilliamWallace30
Sir_Constantin
jerom_the_brave
elvarg_flame
refinedchaos
Metis
Lancener
Neverseperat
musketeer925
maxulino
Zack_iz_Weird
StormComing
Elle semble créer QueryESO.xml très bien pour moi, même si elle n'est pas là (quand il n'est pas l'erreur, bien sûr). Si ce n'est pas le cas pour vous, un fichier vide appelé QueryESO.xml fonctionne correctement, qu'il obtient son contenu à partir d'une page web.
Le bouton "Actualiser" est celui qui a l'erreur.
file
est le nom du type de fichier en Python, il est considéré comme une mauvaise pratique pour le remplacer.Le code spécifie "QueryESO.xml" par lui-même, correct? (Pas de chemin/les répertoires en face?)
Le code que j'ai posté est exactement ce qui est dans mon script... donc il n'y a pas tous les chemins d'accès ou des répertoires en face. Cela fonctionne parce que le fichier est dans le même répertoire (à droite?). et @katrielalex: je vais être sûr de le changer de la substitution de la intégré dans un nom de fichier.
juste pour info, ne pouvait pas doublon avec 2.6.6 et le code donné
Je doute que c'est pertinent, mais il vous manque un
f.close()
dans DeleteFriend()
(dans le if name in fs
section.)
OriginalL'auteur Adam Seitz | 2011-02-24
Vous devez vous connecter pour publier un commentaire.
Quelques observations:
(1) Si le problème a été caractères non valides dans le nom de fichier réel, il serait évident à partir du message d'erreur; voir ci-dessous:
(2) dites-Vous que vous utilisez une constante globale pour le nom de fichier, mais il y a DEUX occurrences du texte littéral (en fonctions AddFriend et IsOnline) -- il aide si vous vous assurez que le code que vous postez est en fait ce que vous avez été en cours d'exécution.
(3) Une des causes de cette "fonctionne 90% du temps" le comportement est une extension (par exemple, tkinter) pas le traitement d'une exception, qui apparaît plus tard, quand quelque chose ne recherchez une erreur. Notez que pour errorno 22, Windows rapports simplement "quelque chose de mauvais s'est passé" et Python a émettre le "oh, dans ce cas, le mode doit être erroné, ou le chemin du fichier doit être mal" message d'erreur.
(4) je ne suis pas à pied à partir d'un puzzle, mais: dans les deux endroits que vous obtenez les résultats à partir du web, de les écrire dans ce fichier, et de les lire -- POURQUOI?? Pourquoi ne pas simplement utiliser le web résultat en mémoire?
Je suis en train de faire la même chose et la raison en est que j'ai télécharger un fichier redimensionner puis la télécharger sur amazon s3. J'obtiens la même erreur. stackoverflow.com/questions/17467967/...
Je suis en train de vivre la même question, et aussi "fonctionne 90% du temps". Je suis de la connexion la sortie de la ligne de commande dans un fichier. J'ai créé plusieurs fichiers pour afficher la sortie de commande différentes. Je suppose que peut-être la raison pour laquelle le problème se produit.
OriginalL'auteur John Machin
Depuis " w " est un mode valide, le problème est avec le nom de fichier. Peut-être que vous n'êtes pas en utilisant le même système de codage dans un contexte. Si c'est seulement dans une fonction, vous pouvez avoir quelques personnages cachés dans cette instance du nom de fichier. Votre première étape de la résolution de ce serait de rendre le nom de fichier au niveau du module constant.
Eh bien, c'est soit parce qu'elle introduit un retard, ou parce qu'il est à l'origine une sorte de tampon d'e/S de chasse d'eau, ou quelque chose de similaire, je suppose. Qu'advient-il si vous faites une
sleep(1)
au lieu de l'imprimer? (import time
premier...)Eh bien... j'ai essayé aujourd'hui à l'aide de sommeil, et quand j'ai mis le sommeil(1), il me donne l'erreur, NameError: nom global de "sommeil" n'est pas défini, et j'ai aussi essayé de temps.sleep(1), qui m'a dit: UnboundLocalError: local variable "temps" référencé avant la cession. J'ai fait l'importation de temps... Quand à l'importation en temps et heure.sleep(1) dans un autre fichier, il a bien fonctionné... je ne suis pas sûr de ce que je fais mal?
OriginalL'auteur Tobu