web-dev-qa-db-fra.com

Copier d'un fichier texte à un autre en utilisant Python

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()
22
DevCon

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) 
57
ATOzTOA

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)
6
tdelaney

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)
5
sage88

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 ()

0
kishor kumar Jha
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

0
Pavan Biradar

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.

0
Jean-François Fabre