Supprimer une ligne d'un fichier en Python
j'essaie de supprimer une ligne spécifique qui contient une chaîne spécifique.
j'ai un fichier appelé nombres.txt avec le contenu suivant:
pierre
tom
tom1
yan
Ce que je veux supprimer, c'est que tom dans le fichier, j'ai donc fait cette fonction:
def deleteLine():
fn = 'numbers.txt'
f = open(fn)
output = []
for line in f:
if not "tom" in line:
output.append(line)
f.close()
f = open(fn, 'w')
f.writelines(output)
f.close()
La sortie est:
pierre
yan
Comme vous pouvez le voir, le problème est que la fonction de suppression tom et tom1, mais je ne veux pas supprimer tom1. Je veux supprimer tom. C'est la sortie que je veux avoir:
pierre
tom1
yan
N'importe quelles idées pour changer la fonction pour faire ceci correctement?
5 réponses
modifier la ligne:
if not "tom" in line:
à:
if "tom" != line.strip():
C'est parce que
if not "tom" in line
vérifie, si tom
n'est pas une sous-chaîne de l'actuel line
. Mais dans tom1
,tom
une sous-chaîne. Ainsi, il est supprimé.
probablement, Vous pourriez voulez que l'un des éléments suivants:
if not "tom\n"==line # checks for complete (un)identity
if "tom\n" != line # checks for complete (un)identity, classical way
if not "tom"==line.strip() # first removes surrounding whitespace from `line`
juste pour le plaisir, voici un deux-doublure pour le faire.
lines = filter(lambda x:x[0:-1]!="tom", open("names.txt", "r"))
open("names.txt", "w").write("".join(lines))
Défi: quelqu'un poste un one-liner pour cela.
import fileinput
for l in fileinput.input("names.txt", inplace=1):
if l != "tom\n": print l[:-1]
Vous pouvez utiliser les regex.
import re
if not re.match("^tom$", line):
output.append(line)
$
signifie la fin de la chaîne.
je suis nouveau dans la programmation et python (quelques mois)... c'est ma solution:
import fileinput
c = 0 # counter
for line in fileinput.input("korrer.csv", inplace=True, mode="rb"):
# the line I want to delete
if c == 3:
c += 1
pass
else:
line = line.replace("\n", "")
print line
c +=1
je suis sûr qu'il y a un moyen plus simple, juste c'est une idée. (mon anglais n'est pas très bon à la recherche!!)