2015-04-08 3 views
1

Я пытаюсь загрузить .txt-файл электронной книги и удалять строки, содержащие номера страниц. Книга выглядит следующим образом:Удаление номеров страниц из файла .txt в Python

2 
Words 
More words. 

More words. 

3 
More words. 

Вот то, что я до сих пор:

x = 1 

with open("first.txt","r") as input: 
    with open("last.txt","wb") as output: 
     for line in input: 
      if line != str(x) + "\n": 
       output.write(line + "\n") 
       x + x + 1 

Мой выходной файл выходит со всеми белого пространства (новых линий) удален (который я не хочу), и он даже не удаляет числа. У кого-нибудь есть идеи? Благодаря!

+3

Что вы ожидаете от 'x + x + 1'? – jonrsharpe

+0

К сожалению, я имел в виду: x = x + 1. Тем не менее исправление, которое не устранило ни одну проблему (пробел или отсутствие каких-либо чисел). Я сделал это так, потому что, когда он нашел номер страницы (например, стр. 1), я хочу, чтобы он искал следующую (например, стр. 2). Это также поможет, если по какой-то причине книга имеет целую строку с номером, который не является номером страницы, но на самом деле является частью книги. –

+0

Вы также можете использовать 'x + = 1'. Но что, если, например, он не начинается со страницы 1? – jonrsharpe

ответ

3

1) Вам не нужно открывать файл для бинарного open("last.txt","wb") ->open("last.txt","w") 2) x + x + 1 ->x += 1

Но, вы могли бы сделать это гораздо проще

with open("first.txt","r") as input: 
    with open("last.txt","w") as output: 
     for line in input: 
      line = line.strip() # clear white space 
      try: 
       int(line) #is this a number ? 
      except ValueError: 
       output.write(line + "\n") 
+3

вам не нужно «strip» и добавлять '\ n',' int ('2 \ r \ n') 'оценивается как' 2'. Кроме того, в коде не должно появляться ничего, кроме предложения. [Ошибки никогда не должны проходить молча. Если явно не отключено] (https://www.python.org/dev/peps/pep-0020/). Вы должны сделать его явным - метод 'int()' вызовет 'ValueError'. –

+0

Это может быть \ s2 \ s не \ r \ n. Какое другое исключение (которое мы заботимся) может int (line) бросить? –

+0

Я не уверен, что означает '\ s'. 'int()' может обрабатывать произвольное количество ведущих и конечных символов, перечисленных в 'string.whitespace'. Об исключениях - 'ìnt()' также может бросать 'TypeError', но никогда в этом контексте (строки всегда строки). Интерпретатор также может поднять 'KeyboardInterrupt', который будет вам незаметным. И вы никогда не хотите этого делать. –

0

сверьтесь может преобразовать строку в целое число и пропустить эту строку, если это произойдет успешно. Не самое быстрое решение, но должно работать.

try: 
    int(line) 
    # skip storing that line 
    continue 
except ValueError: 
    # save the line to output 
+0

Слишком поздно, ответ Тасоса - это именно это. – Marek

0

Используйте регулярные выражения, чтобы игнорировать строки, содержащие только число.

import sys 
import re 

pattern = re.compile("""^\d+$""") 

for line in sys.stdin: 
    if not pattern.match(line): 
     sys.stdout.write(line) 
+1

Вы должны сделать эту строку необработанной, а не многострочной: 'r"^\ d + $ "'. – jonrsharpe

0

Улучшенное решение - один меньше уровня отступа, избежать ненужных strip и струнное суммирование, явное исключение пойманного.

with open("first.txt","r") as input_file, open("last.txt","w") as output_file: 
    for line in input_file: 
     try: 
      int(line) 
     except ValueError: 
      output_file.write(line)