2017-10-21 88 views
1

Je crée un type de fichier pour stocker des informations de mon programme. Le type de fichier peut inclure des lignes commençant par #, comme:Supprimer tous les articles dans la liste commençant par #

# This is a comment. 

Comme le montre, le # devant une ligne indique un commentaire. J'ai écrit un programme en Python qui peut lire ces fichiers:

fileData = [] 

file = open("Tutorial.rdsf", "r") 

line = file.readline() 

while line != "": 
    fileData.append(line) 
    line = file.readline() 

for item in list(fileData): 
    item.strip() 

fileData = list(map(lambda s: s.strip(), fileData)) 

print(fileData) 

Comme vous pouvez le voir, il prend le fichier, ajoute chaque ligne comme un élément dans une liste, et les bandes les éléments de \ n. Jusqu'ici tout va bien.

Mais souvent ces fichiers contiennent des commentaires que j'ai faits, et un tel programme les ajoute à la liste.

Y at-il un moyen de supprimer tous les éléments de la liste en commençant par #?

Edit: Pour rendre les choses un peu plus clair: les commentaires ne seront pas comme ceci:

Some code: 
{Some Code} #Foo 

Ils seront comme ceci:

#Foo 
Some code: 
{Some Code} 
+2

N'utilisez pas de boucle while et parcourez directement le fichier. Votre boucle readline' peut être remplacée par 'fileData = file.readlines() '(pluriel) ou' fileData = liste (fichier) '. –

+1

Votre boucle 'for' effaçant les lignes ne fonctionne pas du tout parce que vous n'attribuez jamais les lignes dénudées. Vous n'avez pas besoin d'appeler 'list()' no un objet déjà une liste. –

+0

Voir [Ce qui est parfait homologue en Python pour "while not eof"] (// stackoverflow.com/q/15599639) –

Répondre

0

Vous pouvez traiter les lignes directement dans un boucle for:

with open("Tutorial.rdsf", "r") as file: 
    for line in file: 
     if line.startswith('#'): 
      continue # skip comments 
     line = line.strip() 

     # do more things with this line 

seulement les mettre dans une liste si vous avez besoin Rando m accès (par ex. vous devez accéder à des lignes à des index spécifiques).

J'ai utilisé une instruction with pour gérer le fichier ouvert, lorsque Python atteint la fin du bloc with, le fichier est automatiquement fermé pour vous.

+0

Nitpick mineur, si ce sont des fichiers de code, alors strip() supprimera l'indentation (utilisez plutôt rstrip). –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ: Je ne pense pas que nous ayons besoin de faire un tel saut avec ce petit contexte, et tout le code ne dépend pas de l'indentation. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ: nous ne savons même pas si les espaces blancs précédant le '#' sont importants. Dans mes lignes de réponse avec des espaces avant que le "#" ne soit ignoré, dans le vôtre ils le sont. Les deux sont des approches valables. –

0

En commençant par le haut, utilisez un gestionnaire de contexte, il est plus facile de travailler avec des fichiers.

with open("Tutorial.rdsf", "r") as f: 
    code = [] 
    for line in f: 
     if not line.strip().startswith('#'): 
      code.append(line.rstrip()) 

Si vous ne voulez pas enlever la nouvelle ligne de fuite, retirer l'appel .rstrip. Une alternative serait de lire dans l'ensemble du fichier, puis d'appeler le filtre.

with open("Tutorial.rdsf", "r") as f: 
    code = filter(lambda x: not x.strip().startswith('#'), f.readlines()) 

Notez que la seconde méthode append vos lignes avec le saut de ligne de fuite.

+0

L'OP a besoin d'une liste de lignes non-rayées. –

+0

@MartijnPieters Oui, les deux le font. Je vais ajouter une solution pour cela, merci. –

-1

Il est facile de vérifier les principaux signes #.

Modifier ceci:

while line != "": 
    fileData.append(line) 
    line = file.readline() 

à ceci:

while line != "": 
    if not line.startswith("#"): 
     fileData.append(line) 
    line = file.readline() 

Mais votre programme est un peu compliqué pour ce qu'il fait. Regardez dans la documentation où il explique à propos de for line in file:.

+1

Ils ne devraient pas utiliser une boucle 'while' ** du tout **. –

+0

@MartijnPieters: J'ai dit ça. – BoarGules