2016-10-14 5 views
1

Я нахожусь в процессе подготовки корпуса текстовых файлов, состоящего из 170 голландских романов. Я литературный ученый и относительно новичок в Python, а также для программирования в целом. То, что я пытаюсь сделать, это написать скрипт Python для удаления всего из каждого .txt-файла, который НЕ принадлежит фактическому содержанию романа (т. Е. Истории). Вещи, которые я хочу удалить: добавлены биографии автора, рекламные ролики и другие фрагменты информации, которые поставляются с преобразованием ePub в .txt.Использование Python для удаления paratext (или «шума») из txt-файлов

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

def removeparatext(inputFilename, outputFilename): 
    inputfile = open(inputFilename,'rt', encoding='utf-8') 
    outputfile = open(outputFilename, 'w', encoding='utf-8') 

    for line_number, line in enumerate(inputfile, 1): 
     if line_number >= 80 and line_number <= 2741: 
      outputfile.write(inputfile.readline()) 

    inputfile.close() 
    outputfile.close() 

removeparatext(inputFilename, outputFilename) 

В номерах 80 и 2741 являются начальными и конечными номерами для фактическое содержание одного конкретного романа. Тем не менее, выходной файл выводит только файл .txt с удаленным текстом ПЕРЕД именем linenumber 80, он все еще содержит все строки AFTER номер 2741. Кажется, я понимаю, почему. Возможно, я неправильно использую функцию enumerate().

Другое дело, что я хотел бы избавиться от всех ненужных пробелов в .txt-файле. Но метод .strip(), похоже, не работает, когда я реализую его в этом блоке кода.

Может ли кто-нибудь дать мне предложение о том, как решить эту проблему? Спасибо заранее!

ответ

1

enumerate уже обеспечивает линию наряду с его индексом, так что вам не нужно снова называть readline на объект файла, как это приведет к непредсказуемому поведению - больше похоже на чтение объекта файла в двойном темпе:

for line_number, line in enumerate(inputfile, 1): 
    if line_number >= 80 and line_number <= 2741: 
     outputfile.write(line) 
#      ^^^^ 

в качестве альтернативы использованию enumerate и перебирая весь файл, вы можете рассмотреть нарезку объекта файла с помощью itertools.islice который берет начало и STO р индексы, а затем писать нарезанную последовательность в выходной файл с помощью writelines:

from itertools import islice 

def removeparatext(inputFilename, outputFilename): 
    inputfile = open(inputFilename,'rt', encoding='utf-8') 
    outputfile = open(outputFilename, 'w', encoding='utf-8') 

    # use writelines to write sliced sequence of lines 
    outputfile.writelines(islice(inputfile, 79, 2741)) # indices start from zero 

    inputfile.close() 
    outputfile.close() 

Кроме того, вы можете открытые файлы и оставить закрытия/очистки на Python, используя менеджер контекста сwith заявление. См. How to open a file using the open with statement.

from itertools import islice 

def removeparatext(inputFilename, outputFilename): 
    with open(inputFilename,'rt', encoding='utf-8') as inputfile,\ 
     open(outputFilename, 'w', encoding='utf-8') as outputfile:  
     # use writelines to write sliced sequence of lines 
     outputfile.writelines(islice(inputfile, 79, 2741)) 


removeparatext(inputFilename, outputFilename) 
+0

Большое вам спасибо! Использование itertools.islice отлично подходит для меня. Я уже знал об использовании инструкции для открытия файлов, но я не был уверен, как использовать ее при открытии двух файлов вместо одного. – roelmetgevoel