2016-03-25 5 views
-1

Je dispose d'un fichier avec ce format:Comment supprimer une ligne spécifique d'un fichier, en fonction d'une liste formée d'entrées?

  1. Frank, 456.768.987
  2. Mike, 123.456.798

Je suis en utilisant ce code:

name = input() 
age = float(input())  
ident = float(input()) 
phone = float(input())  
f = open("Test.txt","r") 
lines = f.readlines() 
f.close() 
f = open("test.txt", "w") 
data = [name, age, ident, phone] 
for line in lines: 
    if line!= data:   
     f.write(line) 

Ainsi, si le liste avec les entrées est égale à une ligne, cette ligne doit être supprimée. Pourquoi ce code ne fonctionne-t-il pas? Les fichiers deviennent vides.

+0

d'abord tout ce que vous n'avez pas besoin de vous convertir * entrée * valeur FLOAT 'parce que le contenu du fichier est une chaîne. Aussi, vous devriez utiliser le module ['csv'] (https://docs.python.org/3/library/csv.html) – styvane

Répondre

0

L'un des problèmes est que vous comparez une chaîne avec une liste. L'autre problème est que vous ne fermez pas le fichier à la fin. Voici une version qui fonctionne:

name = "Frank" 
age = 456 
ident = 768 
phone = 987 

f=open("Test.txt","r") 
lines=f.readlines() 
f.close() 

data=",".join(map(str, [name,age,ident,phone])) 
with open("test.txt", "w+") as x: 
    for line in lines: 
     if line.strip() != data: 
      x.write(line) 

Je viens Hardcoded les valeurs au début par souci de simplicité. Je suppose que le fichier aura toujours le même format correct. Vous pouvez également utiliser regex et faire une correspondance de modèle. Ici, je fais en sorte que je suis en train de convertir toutes les valeurs de chaîne, car join n'acceptera tout entier:

data=",".join(map(str, [name,age,ident,phone])) 
0

Cela devrait fonctionner:

f=open("Test.txt","r") 
fw=open("test.txt","w") 
data= name+","+str(age)+","+str(ident)+","+str(phone) 
for line in f: 
    if not(data in line): 
     fw.write(line) 
f.close() 
fw.close() 
0

Le problème est que line est une chaîne, et data est une liste. En outre, ne pas convertir en float parce que vous devrez reconvertir en chaîne. Enfin, cela échouera également en raison des caractères de fin de ligne à la fin de chaque ligne.

name=input() 
age=input() 
ident=input() 
phone=input() 

with open("Test.txt","r") as f: 
    lines=f.readlines() 
with open("test.txt","w") as f: 
    data=[name,age,ident,phone] 
    for line in lines: 
    if any(l!=d for l,d in zip(line.strip('\n\r').split(','),data)): 
     f.write(line) 

Cette solution compare deux listes, article par article. Une autre solution serait de construire une chaîne unique avec ",".join(data) (voir les réponses des autres).

0

Le code suivant fonctionne correctement.

name=input() 
age=input() 
ident=input() 
phone=input() 

f=open("Test.txt","r") 
fw=open("TestResult.txt","w") 
data= name+","+str(age)+","+str(ident)+","+str(phone) 
for line in f: 
    if not(data in line): 
    fw.write(line) 
f.close() 
fw.close() 

Test.txt entrée

 
shovon,23,1628,017 
shovo,24,1628,017 
shov,25,1628,017 
sho,26,1628,017 

TestResult.txt sortie

 
shovo,24,1628,017 
shov,25,1628,017 
sho,26,1628,017