2011-08-08 12 views
9

To wydaje się proste pytanie, ale nie jestem w stanie dokładnie określić mojego problemu. Próbuję usunąć wszystkie linie w pliku, który zaczyna się od oktothorpe (#) z wyjątkiem pierwszego wiersza. Oto pętla, z którą pracuję:Używaj Pythona do usuwania linii w plikach zaczynających się od Oktothorpe?

for i, line in enumerate(input_file): 
    if i > 1: 
     if not line.startswith('#'): 
      output.write(line) 

Powyższy kod wydaje się nie działać. Czy ktoś wie, jaki jest mój problem? Dzięki!

+4

Czy możesz nam powiedzieć, co robi, że nie jest w porządku? –

+0

Zamierzam założyć, że chcesz linii, które * inne niż białe znaki * zaczynają się od ośmiokąta. Zobacz moją odpowiedź. – Chris

+0

Czy jestem jedyną osobą, która nie wiedziała, czym jest Oktothorpe? –

Odpowiedz

13

Nie jesteś wypisywanie pierwszą linię:

for i, line in enumerate(input_file): 
    if i == 0: 
     output.write(line) 
    else: 
     if not line.startswith('#'): 
      output.write(line) 

Należy pamiętać również, że enumerate (jak większość rzeczy) zaczyna się od zera.

Nieco bardziej zwięzły (i nie powtarzając linię wyjściową):

for i, line in enumerate(input_file): 
    if i == 0 or not line.startswith('#'): 
     output.write(line) 
+1

Dziękujemy za cierpliwość. Twoja odpowiedź rozwiązała mój problem. Bardzo doceniam pomoc i podziękowania za pokazanie mi, jak używać wyrażenia 'or not''! – drbunsen

3

może chcesz pominąć wiersze z wyjścia, gdzie pierwszy bez spacji postać jest octothorpe:

for i, line in enumerate(input_file): 
    if i == 0 or not line.lstrip().startswith('#'): 
     output.write(line) 

(uwaga na wezwanie do lstrip)

+0

Dzięki za wskazanie sposobu użycia 'lstrip'method. W moim przypadku nigdy nie ma spacji przed ośmiokąciem, więc myślę, że jestem bezpieczny tylko za pomocą metody "startswith". – drbunsen

+0

To nie zapisuje pierwszego wiersza. – smci

+0

@smci Przyjąłem, że pomijanie pierwszej linii było zamierzonym i oczekiwanym zachowaniem: "Próbuję usunąć wszystkie linie w pliku rozpoczynającym się od Oktothorpe (#) z wyjątkiem pierwszego wiersza". Zmienię swoją, by odzwierciedlić Neda powyżej. – Chris

4

nie przeszkadzało z enumerate tutaj. Wystarczy, że zdecyduje, która linia jest pierwsza, a która nie. To powinno być łatwe do opanowania przez napisanie pierwszej linii, a następnie użycie pętli for, aby warunkowo napisać dodatkowe linie, które nie zaczynają się od "#".

def removeComments(inputFileName, outputFileName): 

    input = open(inputFileName, "r") 
    output = open(outputFileName, "w") 

    output.write(input.readline()) 

    for line in input: 
     if not line.lstrip().startswith("#"): 
      output.write(line) 

    input.close() 
    output.close() 

Dzięki twopoint718 za wskazanie zalet korzystania z lstrip.

Powiązane problemy