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 Réponses :
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 >
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.
Une meilleure option serait str.startswith
a > vérifie exactement ce que son nom implique: si une chaîne commence par le préfixe demandé, non. Aucun espace blanc de début de suppression avec lstrip
va exposer comme par magie les commentaires en commençant au milieu d'une ligne. str.find
, qui renvoie l'index du commentaire sur la ligne. def skip_comments(file):
for line in file:
index = line.find('//')
if index >= 0:
yield line[:index]
else:
yield line
p >
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.
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)
Merci beaucoup rusu_ro1
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