Veuillez (comme toujours) suivre les directives générales relatives aux questions , indiquer les restrictions spéciales, montrer ce que vous avez essayé jusqu'à présent et demander ce qui vous déroute spécifiquement.
18
Veuillez également marquer vos devoirs avec la balise [devoirs].
"t" pour le mode texte est uniquement Python 3. En outre, vous fournissez un gestionnaire de contexte pour votre fichier de sortie, mais vous ne parvenez pas à fermer votre fichier d'entrée, ce qui semble incohérent.
Steven Rumbalski
1
@katrielalex: Il n'y a pas de vote négatif, je n'ai simplement pas voté pour. Mais donner des réponses aux devoirs n'est pas la bonne façon de le faire
BlueRaja - Danny Pflughoeft
Euh, je n'ai pas remarqué que c'était étiqueté "devoirs". Je ne supprimerai pas ma réponse mais serai plus prudent à l'avenir
Gareth Davidson
21
"donner des réponses aux problèmes de devoirs" est un commentaire extrêmement stupide. Si quelqu'un veut de l'aide, aidez-le. Tout le monde ne cherche pas à faire son matériel, certains veulent en fait apprendre quelque chose ...
KingMak
5
J'en avais besoin pour mes devoirs et cela m'a énormément aidé
mikeybeck
78
Si vous souhaitez remplacer les chaînes dans le même fichier, vous devez probablement lire son contenu dans une variable locale, la fermer et la rouvrir pour l'écriture:
J'utilise l'instruction with dans cet exemple, qui ferme le fichier une fois le withbloc terminé - soit normalement à la fin de l'exécution de la dernière commande, soit par une exception.
def inplace_change(filename, old_string, new_string):# Safely read the input filename using 'with'with open(filename)as f:
s = f.read()if old_string notin s:print('"{old_string}" not found in {filename}.'.format(**locals()))return# Safely write the changed content, if found in the filewith open(filename,'w')as f:print('Changing "{old_string}" to "{new_string}" in {filename}'.format(**locals()))
s = s.replace(old_string, new_string)
f.write(s)
Il est à noter que si les noms de fichiers étaient différents, nous aurions pu le faire plus élégamment avec une seule withinstruction.
OP a mentionné «toutes les occurrences», cela signifie, même s'il s'agit d'une sous-chaîne - ce qui ne fonctionnera pas pour votre exemple.
Durdu
7
with open('Stud.txt','r')as f:
newlines =[]for line in f.readlines():
newlines.append(line.replace('A','Orange'))with open('Stud.txt','w')as f:for line in newlines:
f.write(line)
from pathlib importPath
file =Path('Stud.txt')
file.write_text(file.read_text().replace('A','Orange'))
Si les fichiers d'entrée et de sortie étaient différents, vous utiliseriez deux variables différentes pour read_textet write_text.
Si vous vouliez une modification plus complexe qu'un simple remplacement, vous affecteriez le résultat de read_textà une variable, la traitiez et enregistriez le nouveau contenu dans une autre variable, puis enregistrez le nouveau contenu avec write_text.
Si votre fichier était volumineux, vous préféreriez une approche qui ne lit pas le fichier entier en mémoire, mais plutôt le traite ligne par ligne comme le montre Gareth Davidson dans une autre réponse ( https://stackoverflow.com/a/4128192/3981273 ) , ce qui nécessite bien sûr d'utiliser deux fichiers distincts pour l'entrée et la sortie.
write_text ne fonctionne pas pour moi. Il ne met pas à jour le fichier
Anurag
0
Le moyen le plus simple est de le faire avec des expressions régulières, en supposant que vous souhaitiez parcourir chaque ligne du fichier (où `` A '' serait stocké), vous faites ...
import re
input = file('C:\full_path\Stud.txt), 'r')
#when you try and write to a file with write permissions, it clears the file and writes only #what you tell it to the file. So we have to save the file first.
saved_input
for eachLine in input:
saved_input.append(eachLine)
#now we change entries with 'A' to 'Orange'
for i in range(0, len(old):
search = re.sub('A', 'Orange', saved_input[i])
if search is not None:
saved_input[i] = search
#now we open the file in write mode (clearing it) and writing saved_input back to it
input = file('C:\full_path\Stud.txt),'w')for each in saved_input:
input.write(each)
Réponses:
la source
Si vous souhaitez remplacer les chaînes dans le même fichier, vous devez probablement lire son contenu dans une variable locale, la fermer et la rouvrir pour l'écriture:
J'utilise l'instruction with dans cet exemple, qui ferme le fichier une fois le
with
bloc terminé - soit normalement à la fin de l'exécution de la dernière commande, soit par une exception.Il est à noter que si les noms de fichiers étaient différents, nous aurions pu le faire plus élégamment avec une seule
with
instruction.la source
la source
Quelque chose comme
la source
la source
Si vous êtes sous Linux et que vous souhaitez simplement remplacer le mot
dog
par,cat
vous pouvez faire:text.txt:
Commande Linux:
Production:
Message d'origine: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands
la source
Utilisation de pathlib ( https://docs.python.org/3/library/pathlib.html )
Si les fichiers d'entrée et de sortie étaient différents, vous utiliseriez deux variables différentes pour
read_text
etwrite_text
.Si vous vouliez une modification plus complexe qu'un simple remplacement, vous affecteriez le résultat de
read_text
à une variable, la traitiez et enregistriez le nouveau contenu dans une autre variable, puis enregistrez le nouveau contenu avecwrite_text
.Si votre fichier était volumineux, vous préféreriez une approche qui ne lit pas le fichier entier en mémoire, mais plutôt le traite ligne par ligne comme le montre Gareth Davidson dans une autre réponse ( https://stackoverflow.com/a/4128192/3981273 ) , ce qui nécessite bien sûr d'utiliser deux fichiers distincts pour l'entrée et la sortie.
la source
Le moyen le plus simple est de le faire avec des expressions régulières, en supposant que vous souhaitiez parcourir chaque ligne du fichier (où `` A '' serait stocké), vous faites ...
la source