Insérer une chaîne de caractères au début de chaque ligne
Comment puis-je insérer une chaîne de caractères au début de chaque ligne dans un fichier texte, j'ai le code suivant:
f = open('./ampo.txt', 'r+')
with open('./ampo.txt') as infile:
for line in infile:
f.insert(0, 'EDF ')
f.close
j'obtiens l'erreur suivante:
"'fichier' objet n'a pas d'attribut "insérer","
Veuillez noter que je suis une programmation complète n00b.
Vous devez vous connecter pour publier un commentaire.
Python est livré avec piles incluses:
Contrairement aux solutions déjà posté, ce qui préserve les autorisations de fichier.
for-loop
parcourt les lignes dansampo.txt
une ligne à la fois.sys.stdout.write
est presque le même queprint
. La raison j'ai choisi d'utilisersys.stdout.write
au lieu deprint
est parce queprint
ajoute un supplément de retour à la ligne, tandis quesys.stdout.write
ne le fait pas. En raison de lainplace=True
argument,fileinput
déplace l'original ampo.txt dans un fichier temporaire, puis redirige stdout vers un nouveau fichier appeléampo.txt
. Puis il copie des autorisations et supprime le fichier temporaire. Il y a plus d'options, comme de garder un fichier de sauvegarde; voir la documentation pour plus d'informations.if fileinput.filelineno() == 3:
à changer de comportement en fonction de la ligne à laquelle vous êtes sur.Vous ne pouvez pas modifier un fichier en place comme ça. Les fichiers ne prennent pas en charge l'insertion. Vous le lire, puis écrire à nouveau.
Vous pouvez le faire ligne par ligne si vous le souhaitez. Mais dans ce cas, vous devez écrire dans un fichier temporaire, puis remplacer l'original. Donc, pour les petites suffisamment de fichiers, il est juste plus simple de le faire en une seule fois comme ceci:
[x for y in z]
forme crée une nouvelle liste d'objet et le vieux ne peuvent pas être récupérées jusqu'à ce que le nouveau est construit, donc à un moment il y a toutes les chaînes d'origine et tous les chaines modifiées dans la mémoire à la fois. Mais il y a aussi(x for y in z)
forme, ce qui crée plutôt un générateur. Les générateurs sont des paresseux; ils exécutent l'expression sur une valeur d'entrée unique à un moment et de le retourner, de sorte qu'il peut être recueilli avant la prochaine est nécessaire, et ils ne sont jamais dans la mémoire en même temps. Dans ce cas, vous devez faire attention de ne pas en faire trop paresseux, depuis fichier prend également en charge paresseux lire.['EDF ' + line for line in open('./ampo.txt', 'r')]
utilise le générateur de lire le fichier paresseusement, mais que évalue la liste avec impatience d'avoir le fichier en totalité dans la mémoire avant de le réécrire.('EDF ' + line for line in f.readlines())
utilise la hâte fonction de lecture pour obtenir le fichier en mémoire, mais que générateur de construire le texte modifié avec impatience. Bien sûr, si vous avez utilisé un générateur pour les deux, vous feriez de vous brûler gravement, parce que vous commenceriez à jour du fichier avant d'obtenir toutes les données hors de lui.Voici une solution où vous écrivez dans un fichier temporaire et de le déplacer dans la place. Vous pourriez préférer cette version si le fichier que vous réécriture est très grande, puisqu'elle évite de garder le contenu du fichier dans la mémoire, comme les versions qui impliquent
.read()
ou.readlines()
volonté. En outre, si il ya une erreur dans la lecture ou l'écriture, votre fichier d'origine sera en sécurité:Pour un fichier pas trop grand:
Noter que , EN THÉORIE, dans CE cas (le contenu est augmentée), la
f.truncate()
peut-être pas vraiment nécessaire. Parce que l'instruction est censé fermer correctement le fichier, c'est-à-dire d'écrire un EOF (fin de fichier ) à la fin avant la fermeture.C'est ce que j'ai observé sur des exemples.
Mais je suis prudent: je pense que c'est mieux de mettre cette instruction de toute façon. Lorsque le contenu diminue, avec l'instruction de ne pas écrire un EOF pour fermer correctement le fichier de moins loin que la précédente initiale expressions du FOLKLORE, d'où fuite initiale personnages reste dans le fichier.
Donc, si l'instruction se complique pas écrire des expressions du FOLKLORE lorsque le contenu diminue, pourquoi serait-il l'écrire lorsque le contenu augmente ?
Pour un gros fichier, pour éviter de mettre tout le contenu du fichier dans la mémoire RAM à la fois:
f.truncate()
?yield
) et toutes les choses qui sont de retour de l'un de leurs__iter__()
méthode (commefile
).map
où vous devriez avoir utilisé de la compréhension dans un cas et de la boucle dans l'autre n'est pas bon python style.