2009-07-24 6 views
25

Załóżmy, że parsuję plik, który używa ; jako znaku komentarza. Nie chcę analizować komentarzy. Gdybym więc linia wygląda następująco:W Pythonie 2.4, jak mogę usunąć znaki po ";"?

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

Czy istnieje łatwiejszy/bardziej elegancki sposób strip zwęgla się innych niż to:

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

Czy używasz pytona <2.5? – SilentGhost

+0

Tak, python2.4. Powinienem wspomnieć, że w? – lfaraone

+3

oraz python2.4 to ** dwie ** wersje za aktualną stabilną wersją. co myślisz? – SilentGhost

Odpowiedz

85

ja polecam mówiąc

line.split(";")[0] 

który da ci ciąg wszystkich znaków, ale nie wliczając pierwszego "; postać. Jeśli nie ";" postać jest obecna, wtedy da ci całą linię.

+14

+1 Można użyć parametru 1, aby parametr maxsplit był doskonały. – Jiri

12

prostu zrobić podział na linii przez komentarzu następnie dostać pierwszy element np

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

Pythona 2,5 lub większej, będzie użyć metody partition:

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

niedostępny dla wersji <2.5 ++ – ghostdog74

+2

@ ghostdog74: stabilne wersje pythona mają rozmiar 2.6 i 3.1 – SilentGhost

+1

@SG, to dobrze, ale nadal, jeśli tak się dzieje nadal wykorzystując <2,5 ++ w produkcji, nie będą mieli tego luksusu. – ghostdog74

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

Popraw składnię –

1

Reading, rozszczepianie odpędzania, połączenie linii z nową linią w jednym wierszu pytona:

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

Nie testowałem tego z pythonem, ale używam podobnego kodu w innym miejscu.

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

Twój re.sub() brakuje argumentu, a więc nie będzie działać - bardzo szczęśliwy, ponieważ ** to śmieci pierwszego ";" w pliku i wszystko po nim ** –

2

Więc chcesz podzielić linię na pierwszym średnikiem, wziąć wszystko przed nim, zdejmować żadnej ociąganie spacje i dołączyć znak nowej linii.

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

Odnośniki do dokumentacji:

+0

Podawane linki i metody, których używasz, nie są takie same – SilentGhost

0

Oto kolejny sposób:

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

jeśli linia == "fubar", która produkuje "fuba \ n" ... korygowanie problemu w jedno-liniowej produkuje to : 'linia [: Brak, jeśli line.find ("; ") == -1 else line.find ("; ")]' (którego z pewnością nie proponuję jako dobrego pomysłu). –

Powiązane problemy