Je voudrais copier certaines lignes de texte d'un fichier texte à un autre. Dans mon script actuel, lorsque je recherche une chaîne, elle copie tout par la suite. Comment puis-je copier une partie du texte? Par exemple. copier uniquement les lignes quand il contient "tests/file/myword"?
code actuel:
#!/usr/bin/env python
f = open('list1.txt')
f1 = open('output.txt', 'a')
doIHaveToCopyTheLine=False
for line in f.readlines():
if 'tests/file/myword' in line:
doIHaveToCopyTheLine=True
if doIHaveToCopyTheLine:
f1.write(line)
f1.close()
f.close()
L'oneliner:
open("out1.txt", "w").writelines([l for l in open("in.txt").readlines() if "tests/file/myword" in l])
Recommandé avec with
:
with open("in.txt") as f:
lines = f.readlines()
lines = [l for l in lines if "ROW" in l]
with open("out.txt", "w") as f1:
f1.writelines(lines)
Utiliser moins de mémoire:
with open("in.txt") as f:
with open("out.txt", "w") as f1:
for line in f:
if "ROW" in line:
f1.write(line)
readlines () lit l'intégralité du fichier d'entrée dans une liste et n'est pas un bon interprète. Il suffit de parcourir les lignes du fichier. J'ai utilisé 'avec' sur output.txt pour qu'il soit automatiquement fermé lorsque vous avez terminé. Ce n'est pas nécessaire sur 'list1.txt' car il sera fermé à la fin de la boucle for.
#!/usr/bin/env python
with open('output.txt', 'a') as f1:
for line in open('list1.txt'):
if 'tests/file/myword' in line:
f1.write(line)
Juste une façon légèrement nettoyée de le faire. Ce n'est ni plus ni moins performant que la réponse de ATOzTOA, mais il n'y a aucune raison de faire deux déclarations séparées.
with open(path_1, 'a') as file_1, open(path_2, 'r') as file_2:
for line in file_2:
if 'tests/file/myword' in line:
file_1.write(line)
avec open ("list1.txt") comme f: doIHaveToCopyTheLine = False '' 'ouvrir le fichier de sortie en mode écriture' '' avec open ("output.txt", 'w') comme f1: '' 'itérer ligne par ligne' ''. pour la ligne dans f: si 'tests/file/myword' est inscrit: doIHaveToCopyTheLine = True Elif doIHaveToCopyTheLine: f1.write (ligne)
f1.close () f.close ()
f=open('list1.txt')
f1=open('output.txt','a')
for x in f.readlines():
f1.write(x)
f.close()
f1.close()
cela fonctionnera à 100% essayer une fois
Coffre-fort et économie de mémoire:
with open("out1.txt", "w") as fw, open("in.txt","r") as fr:
fw.writelines(l for l in fr if "tests/file/myword" in l)
Il ne crée pas de listes temporaires (ce que feraient readline
et []
, ce qui est un non-démarreur si le fichier est énorme), tout est fait avec les compréhensions du générateur, et en utilisant des blocs with
, vous assurez que les fichiers sont fermés à la sortie.