J'essaie de former un fichier de guillemets d'un nom d'utilisateur spécifique dans un fichier journal. Comment puis-je supprimer chaque ligne qui ne contient pas le nom d'utilisateur spécifique dans celui-ci? Ou comment écrire toutes les lignes qui contiennent ce nom d'utilisateur dans un nouveau fichier?Supprimer des lignes d'un fichier texte qui ne contient pas une certaine chaîne avec python
Répondre
Quelque chose le long de cette ligne devrait suffire:
newfile = open(newfilename, 'w')
for line in file(filename, 'r'):
if name in line:
newfile.write(line)
newfile.close()
Voir: http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects
f.readlines() retourne une liste contenant toutes les lignes de données dans le fichier.
Une approche alternative à la lecture des lignes consiste à faire une boucle sur l'objet fichier. Cette mémoire est efficace, rapide et conduit à un code plus simple
>>> for line in f:
print line
vous pouvez également l'utilisation de la caisse mot-clé with
. L'avantage que le fichier est correctement fermé après sa suite se termine
>>> with open(filename, 'r') as f:
... read_data = f.read()
>>> f.closed
True
with open('input.txt', 'r') as rfp:
with open('output.txt', 'w') as wfp:
for line in rfp:
if ilikethis(line):
wfp.write(line)
with open(logfile) as f_in:
lines = [l for l in f_in if username in l]
with open(outfile, 'w') as f_out:
f_out.writelines(lines)
Ou si vous ne voulez pas stocker toutes les lignes en mémoire
with open(logfile) as f_in:
lines = (l for l in f_in if username in l)
with open(outfile, 'w') as f_out:
f_out.writelines(lines)
Je peu comme le premier mieux mais pour un gros fichier, il pourrait glisser.
Vous n'avez pas besoin de retrait de la deuxième « avec » dans le second cas , pour la même raison que vous n'avez pas besoin dans le premier cas. –
@Karl Knechtel Je fais réellement. Parce que dans le second cas j'utilise une expression de générateur, le fichier sera fermé et cela provoquera une erreur quand l'expression de générateur sera réellement traitée si l'instruction 'with' se termine. Essayez-le. C'est la seule chose à laquelle je peux penser pour utiliser des expressions de générateurs avec le traitement de fichiers. – aaronasterling
Ah, je vois. L'existence du générateur ne gardera pas le fichier ouvert. Idiote moi :) –
Je sais que vous avez demandé Python, mais si vous êtes sous Unix c'est un travail pour grep.
grep name file
Si vous n'êtes pas sur unix, eh bien ... la réponse ci-dessus l'affaire :)
http://gnuwin32.sourceforge.net/packages/grep.htm –
encore mieux! :) – John
C'est parfait – pyfunc