io.UnsupportedOperation: pas lisible
Je suis en train de travailler sur un problème dit de faire un programme qui reçoit une entrée d'utilisateur pour un fichier, puis dans le fichier supprime une chaîne qui spécifie l'utilisateur. Je ne suis pas sûr de savoir comment aller de ce que j'ai(ci-dessous) à ce que la question demande. Comme toujours, toute aide est grandement appréciée.
def main():
outfile = open(input("Enter a file name: "), "a")
string = input("Enter the string to be removed: ")
for string in outfile.readlines():
string = string.replace(string, "")
outfile.close()
print("Done")
main()
J'ai pris l'une des suggestions et a essayé de le faire fonctionner, mais comme je l'ai dit dans mon commentaire ci-dessous le code ci-dessous ne retourne pas une erreur, il crée un fichier vide. Ce qui me manque pour obtenir le nouveau fichier à l'ancien fichier avec la chaîne supprimé?
def main():
inpath = input("Enter an input file: ")
line = input("Enter what you want to remove: ")
outpath = input("Enter an output file: ")
with open(inpath, "r") as infile, open(outpath, "w") as outfile:
for line in infile:
outfile.write(line.replace(line, "") + "\n")
print("Done.")
main()
vous devez ouvrir le fichier en mode lecture. Essayez
Comme une note de côté, vous avez trop de variables nommées
C'est vrai, mais il ne va pas vraiment vous aider dans ce cas. Vous ne pouvez pas écrire dans le fichier dans le milieu de l'itération sur la lecture—ou, plutôt, vous pouvez, mais ça va faire des choses malheureuses, et les différents événements malheureux sur différentes plates-formes. Pourtant, c'est un point de départ—et c'est l'explication directe de l'erreur les OP le titre mentionne.
Double Possible de Python message d'erreur io.UnsupportedOperation: pas lisible
ma question est plus vieux, donc le fil que vous avez mentionné serait le double.
"a+"
Comme une note de côté, vous avez trop de variables nommées
string
. vous voulez probablement string1 = input(...)
et puis string = string.replace(string1,"")
. Enfin, vous avez réellement besoin d'écrire la chaîne de retour dans un fichier. C'est un peu difficile de remplacer des chaînes de caractères dans un fichier. Habituellement, vous créez un nouveau fichier avec le contenu modifié et puis à la fin de la journée, vous déplacez le nouveau fichier sur le dessus de l'ancien fichier.C'est vrai, mais il ne va pas vraiment vous aider dans ce cas. Vous ne pouvez pas écrire dans le fichier dans le milieu de l'itération sur la lecture—ou, plutôt, vous pouvez, mais ça va faire des choses malheureuses, et les différents événements malheureux sur différentes plates-formes. Pourtant, c'est un point de départ—et c'est l'explication directe de l'erreur les OP le titre mentionne.
Double Possible de Python message d'erreur io.UnsupportedOperation: pas lisible
ma question est plus vieux, donc le fil que vous avez mentionné serait le double.
OriginalL'auteur John Joseph | 2012-11-13
Vous devez vous connecter pour publier un commentaire.
A côté de quelques notes avant d'entrer dans les détails: Lorsque vous appelez
string.replace(string, "")
, vous dites à la chaîne pour remplacer l'ensemble de son auto avec la chaîne vide—vous pourriez tout aussi bien fairestring = ""
. Sans doute la premièrestring
est la recherche de la chaîne à remplacer, afin de lui donner un autre nom, et ensuite l'utiliser comme, par exemple,string.replace(searchString, "")
. Aussi, vous ne voulez pas le nom d'une variablestring
, parce que c'est le nom d'une bibliothèque standard du module. Vous appelez votre fichier d'entrée "outfile", qui est apte à être source de confusion. Vous voudrez probablement utiliser unewith
instruction au lieu d'un explicite à proximité. Enfin, vous pouvez parcourir les lignes dans un fichier avec justefor line in f:
; vous n'avez pas besoinfor line in f.readlines()
(et, si jamais vous avez besoin de traiter avec Python 2.x, vous allez être beaucoup plus heureux en évitantreadlines()
, parce qu'il va lire tout le fichier en mémoire, et ensuite faire une liste énorme de lignes dans la mémoire).Le premier problème, comme JBernardo souligné, c'est que vous avez ouvert le fichier dans "une mode", qui signifie "écriture seule, en ajoutant à la fin". Vous pouvez utiliser un "+" ou "r+" si vous souhaitez lire et écrire.
Cependant, qui ne sera pas vraiment vous aider. Après tout, vous ne pouvez pas écrire dans le fichier dans le milieu de la lecture.
Il y a quelques façons de contourner cela.
Tout d'abord, il suffit d'écrire sur la sortie standard, et de permettre à l'utilisateur de faire ce qu'il veut avec les résultats—par exemple, rediriger vers un fichier. (Dans ce cas, vous avez l'impression de vos commandes", qui Fait" du message, etc. erreur standard à la place, afin de ne pas être redirigé vers le fichier.) C'est ce que de nombreux outils Unix comme
sed
ousort
faire, il est donc approprié si vous êtes à la bâtiment de style Unix, outil, mais peut-être pas le droit à d'autres fins.Deuxième, écrire dans un autre fichier. Ouvrez le fichier d'entrée dans le "r" de mode, et le fichier de sortie en "w", à la mode, et vous êtes juste à copier les lignes:
Troisième, de lire et de traiter tout le fichier en mémoire, puis tronquer et de réécrire la totalité du fichier:
Enfin, écrire dans un fichier temporaire (comme avec la deuxième option), puis déplacez le fichier temporaire sur le dessus de l'entrée d'origine du fichier. Quelque chose comme ceci:
Ce dernier est un peu délicat, en raison des différences entre la norme POSIX et Windows. Cependant, il a quelques gros avantages. (Par exemple, si votre programme se fait tuer dans le milieu de l'opération, peu importe comment ça se passe, vous avez la garantie d'avoir le fichier d'origine ou le nouveau fichier, pas une demi-écrit mess.)
string = string.replace(string,"")
est un non-sens dans cette boucle. Lors de la deuxième ligne, vous êtes à la chaîne de remplacement est la première ligne.C'est même pire. Lors de la deuxième ligne, votre chaîne de remplacement est la deuxième ligne. À chaque ligne, votre chaîne de remplacement est la ligne actuelle.
Bon vous êtes!
En fait, à bien y penser, étant donné que la première ligne est la garantie d'être
""
, déclarations s'avèrent pour être vrai...Vous avez juste besoin d'un des quatre. Mais vous devez décider de la quatre vous le souhaitez, ce qui signifie que vous devez comprendre comment ils sont différents, et aussi de comprendre ce que vous essayez d'accomplir.
OriginalL'auteur abarnert