2009-07-24 5 views
25

Supposons que j'analyse un fichier, qui utilise ; comme caractère de commentaire. Je ne veux pas analyser les commentaires. Donc, si je une ligne ressemble à ceci:Dans Python 2.4, comment puis-je supprimer les caractères après ';'?

example.com.    600  IN  MX  8 s1b9.example.net ; hello! 

est-il un moyen plus facile/moyen plus-élégante bande caractères sur autre que ceci:

rtr = '' 
for line in file: 
    trig = False 
    for char in line: 
     if not trig and char != ';': 
      rtr += char 
     else: 
      trig = True 
    if rtr[max(rtr)] != '\n': 
     rtr += '\n' 
+0

utilisez-vous python <2.5? – SilentGhost

+0

Oui, python2.4. Aurait dû mentionner que dans le ?? – lfaraone

+3

bien python2.4 est ** deux ** versions derrière la version stable actuelle. Qu'est-ce que tu penses? – SilentGhost

Répondre

85

Je recommande de dire

line.split(";")[0] 

qui vous donnera une chaîne de tous les caractères jusqu'à la première ";" personnage. Sinon ";" le caractère est présent, alors il vous donnera la ligne entière.

+14

+1 Vous pouvez utiliser 1 pour maxsplit param pour être parfait – Jiri

12

Il suffit de faire une scission sur la ligne par commentaires, puis obtenir le premier élément par exemple

line.split(";")[0] 
4

pour python 2,5 ou plus, je voudrais utiliser la méthode partition:

rtr = line.partition(';')[0].rstrip() + '\n' 
+0

non disponible pour la version <2.5 ++ – ghostdog74

+2

@ ghostdog74: les versions stables de python sont 2.6 et 3.1 – SilentGhost

+1

@SG, c'est bien, mais quand même, si on est toujours en utilisant <2.5 ++ en production, ils n'auront pas ce luxe. – ghostdog74

2
file = open(r'c:\temp\test.txt', 'r') 
for line in file: print 
    line.split(";")[0].strip() 
+2

fixez votre syntaxe –

1

lecture, fractionnement, extraction, et des lignes de jonction avec saut de ligne en une seule ligne de python:

rtr = '\n'.join(line.split(';')[0].strip() for line in open(r'c:\temp\test.txt', 'r')) 
-2

Je n'ai pas testé cela avec python mais j'utilise du code similaire ailleurs où.

import re 
content = open(r'c:\temp\test.txt', 'r').read() 
content = re.sub(";.+", "\n") 
+1

votre re.sub() manque un argument et ne fonctionnera donc pas - très chanceux car ** il détruirait le premier ';' dans le fichier et tout ce qu'il après ** –

2

Vous aurez envie de diviser la ligne sur le premier point-virgule, prendre tout devant elle, dépouiller les espaces blancs persistante, et ajouter un caractère de nouvelle ligne.

rtr = line.split(";", 1)[0].rstrip() + '\n' 

Liens vers Documentation:

+0

liens que vous fournissez et les méthodes que vous utilisez ne sont pas les mêmes – SilentGhost

0

Voici une autre façon:

 
In [6]: line = "foo;bar" 
In [7]: line[:line.find(";")] + "\n" 
Out[7]: 'foo\n' 
+0

si ligne == "fubar", qui produit "fuba \ n" ... corriger le problème dans un one-liner produit ce : 'line [: None si line.find ("; ") == -1 else line.find ("; ")]' (ce que je ne propose certainement pas du tout comme une bonne idée). –

Questions connexes