J'essaie de lire un texte à partir d'un fichier texte, de lire des lignes, de supprimer des lignes qui contiennent une chaîne spécifique (dans ce cas, "bad" et "naughty"). Le code que j'ai écrit se présente comme suit:
infile = file('./oldfile.txt')
newopen = open('./newfile.txt', 'w')
for line in infile :
if 'bad' in line:
line = line.replace('.' , '')
if 'naughty' in line:
line = line.replace('.', '')
else:
newopen.write(line)
newopen.close()
J'ai écrit comme ça mais ça ne marche pas.
Une chose importante est, si le contenu du texte était comme ceci:
good baby
bad boy
good boy
normal boy
Je ne veux pas que la sortie ait des lignes vides. donc pas comme:
good baby
good boy
normal boy
mais comme ça:
good baby
good boy
normal boy
Que dois-je modifier à partir de mon code ci-dessus?
Vous pouvez rendre votre code plus simple et plus lisible comme celui-ci
bad_words = ['bad', 'naughty']
with open('oldfile.txt') as oldfile, open('newfile.txt', 'w') as newfile:
for line in oldfile:
if not any(bad_Word in line for bad_Word in bad_words):
newfile.write(line)
en utilisant un Context Manager et any .
Vous ne pouvez tout simplement pas inclure la ligne dans le nouveau fichier au lieu de remplacer.
for line in infile :
if 'bad' not in line and 'naughty' not in line:
newopen.write(line)
Je l'ai utilisé pour supprimer les mots indésirables des fichiers texte:
bad_words = ['abc', 'def', 'ghi', 'jkl']
with open('List of words.txt') as badfile, open('Clean list of words.txt', 'w') as cleanfile:
for line in badfile:
clean = True
for Word in bad_words:
if Word in line:
clean = False
if clean == True:
cleanfile.write(line)
Ou pour faire de même pour tous les fichiers d'un répertoire:
import os
bad_words = ['abc', 'def', 'ghi', 'jkl']
for root, dirs, files in os.walk(".", topdown = True):
for file in files:
if '.txt' in file:
with open(file) as filename, open('clean '+file, 'w') as cleanfile:
for line in filename:
clean = True
for Word in bad_words:
if Word in line:
clean = False
if clean == True:
cleanfile.write(line)
Je suis sûr qu'il doit y avoir une façon plus élégante de le faire, mais cela a fait ce que je voulais.
else
est uniquement connecté au dernier if
. Vous voulez Elif
:
if 'bad' in line:
pass
Elif 'naughty' in line:
pass
else:
newopen.write(line)
Notez également que j'ai supprimé la substitution de ligne, car vous n'écrivez pas ces lignes de toute façon.
Aujourd'hui, j'avais besoin d'accomplir une tâche similaire, j'ai donc rédigé un Gist pour accomplir la tâche sur la base de certaines recherches que j'ai faites. J'espère que quelqu'un trouvera cela utile!
import os
os.system('cls' if os.name == 'nt' else 'clear')
oldfile = raw_input('{*} Enter the file (with extension) you would like to strip domains from: ')
newfile = raw_input('{*} Enter the name of the file (with extension) you would like me to save: ')
emailDomains = ['windstream.net', 'mail.com', 'google.com', 'web.de', 'email', 'yandex.ru', 'ymail', 'mail.eu', 'mail.bg', 'comcast.net', 'yahoo', 'Yahoo', 'gmail', 'Gmail', 'GMAIL', 'hotmail', 'comcast', 'bellsouth.net', 'verizon.net', 'att.net', 'roadrunner.com', 'charter.net', 'mail.ru', '@live', 'icloud', '@aol', 'facebook', 'Outlook', 'myspace', 'rocketmail']
print "\n[*] This script will remove records that contain the following strings: \n\n", emailDomains
raw_input("\n[!] Press any key to start...\n")
linecounter = 0
with open(oldfile) as oFile, open(newfile, 'w') as nFile:
for line in oFile:
if not any(domain in line for domain in emailDomains):
nFile.write(line)
linecounter = linecounter + 1
print '[*] - {%s} Writing verified record to %s ---{ %s' % (linecounter, newfile, line)
print '[*] === COMPLETE === [*]'
print '[*] %s was saved' % newfile
print '[*] There are %s records in your saved file.' % linecounter
Lien vers Gist: emailStripper.py
Best, Az
Utilisez le paquet python-textops:
from textops import *
'oldfile.txt' | cat() | grepv('bad') | tofile('newfile.txt')
to_skip = ("bad", "naughty")
out_handle = open("testout", "w")
with open("testin", "r") as handle:
for line in handle:
if set(line.split(" ")).intersection(to_skip):
continue
out_handle.write(line)
out_handle.close()