2
votes

la ligne de commentaire n'est pas d'échappement si elle est dans le même code de ligne de mon fichier input.txt avec python

J'ai des lignes contenant des commentaires marqués par // dans mon fichier input.txt :

Fichier d'entrée

XXX

Ici, la ligne 3 est ignorée, mais pas la ligne 2.

Mon code

def skip_comments(file):
    for line in file:
        if not line.lstrip().startswith('//'):
            yield line

f = open('input.txt')
for line in skip_comments(f):
    f_write.write(line)


3 commentaires

La ligne 2 commence par une double barre oblique à votre avis?


startswith ne vérifiera que démarrer pas au milieu.


Oh oui. Merci skaul05


3 Réponses :


2
votes

vous devez écrire votre code comme ceci:

def skip_comments(file):
for line in file:
    if line.startswith('//'):
        continue
    elif line.find("/*")>=0:
        while(line.find("/*")>=0):
            startIndex = line.find("/*")
            endIndex = line.find("*/")
            line = line[:startIndex] + line[endIndex + len("*/"):]
        yield line
    else
        line = line.split("//")[0]
        yield line

mise à jour

si vous voulez vérifier un commentaire plus complexe, je suggère le code ci-dessous :

def skip_comments(file):
for line in file:
    if line.startswith('//'):
        continue
    elif line.find("/*")>=0:
        startIndex = line.find("/*")
        endIndex = line.find("*/")
        line = line[:startIndex] + line[endIndex + len("*/"):]
        yield line
    else
        line = line.split("//")[0]
        yield line

et vous pouvez mettre la partie centrale tout comme ceci afin de supprimer tous les commentaires de la ligne:

def skip_comments(file):
for line in file:
    if not line.lstrip().startswith('//'):
        line = line.split("//")
        yield line[0]

p >


5 commentaires

Merci beaucoup Abbas Dehghan


Bonjour Abbas Dehghan, si je veux vérifier plus de conditions, supposons que la ligne de commentaire commence par / * et la termine par / nous le savons déjà. Donc, dans ce cas, je ne peux pas plus vérifier dans une ligne avec dans votre ligne à 3 chiffres ici sinon line.lstrip (). Startswith ('//'): si j'utilise ici 'ou' ou 'et' comme sinon line.lstrip (). startswith ('//') ou line.lstrip (). startswith ('/ ') et line.lstrip (). endswith ('* /'): et même règle J'ai coulé sous le code mais je ne travaille que dans la première condition ici. Ai-je utilisé une autre condition pour cela?


Principalement, je voulais savoir que la ligne de commentaire // et / * * / contient dans mon code. Donc, dans ce cas, je ne peux pas utiliser ici dans une seule condition. Individuellement, cela fonctionne bien.


Oh oui, juste l'esprit que j'ai utilisé elif pour vérifier et c'est bien mais mon fichier de sortie est un peu bruyant.


Merci. Votre premier code de mise à jour fonctionne simplement pour une ligne et dans le cas du milieu en commentaire, votre deuxième code de mise à jour peut manquer lors de l'utilisation de la boucle. Quand cela obtient une nouvelle ligne par exemple / * quelque chose de newline quelque chose * / et cette fois votre boucle est à l'infini et c'est pourquoi l'ordinateur se bloque.



2
votes

4 commentaires

Merci beaucoup Mad Physicist


@Prosenjit. Vous avez maintenant assez de réputation pour voter pour les réponses que vous aimez, ce qui est la bonne façon de remercier cette communauté. Lorsque vous en avez l'occasion, veuillez sélectionner une réponse en cliquant sur la coche à côté de celle que vous préférez. Cela supprimera votre question de la file d'attente sans réponse.


Oui je l'ai fait selon ma question. Merci pour vos conseils.


Désolé, je l'ai oublié. Maintenant ça va. Merci.



1
votes

vous pouvez vérifier si // est dans votre ligne et conserver simplement le texte qui apparaît avant //

for line in (l.split('//')[0].strip() for l in open('input.txt', mode='r') if l.split('//')[0].strip()):
        f_write.write(line)


1 commentaires

Merci beaucoup rusu_ro1