Большая проблема с анализом TXT-файла в python - PullRequest
3 голосов
/ 22 июля 2011

Я пытался понять это целый день. У меня есть большой текстовый файл (546 МБ), который я пытаюсь проанализировать в python, пытаясь вытащить текст между открытым тегом и закрытым тегом, и у меня продолжают возникать проблемы с памятью. С помощью хороших людей на этой доске это то, что я имею до сих пор.

answer = ''
output_file = open('/Users/Desktop/Poetrylist.txt','w')

with open('/Users/Desktop/2e.txt','r') as open_file:
    for each_line in open_file:
        if each_line.find('<A>'):
            start_position = each_line.find('<A>')
            start_position = start_position + 3
            end_position = each_line[start_position:].find('</W>')

            answer = each_line[start_position:end_position] + '\n'
            output_file.write(answer)

output_file.close()

Я получаю это сообщение об ошибке:

Traceback (most recent call last):
  File "C:\Users\Adam\Desktop\OEDsearch3.py", line 9, in <module>
    end_position = each_line[start_position:].find('</W>')
MemoryError

У меня практически нет опыта программирования, и я пытаюсь выяснить это для поэтического проекта, над которым я работаю. Любая помощь с благодарностью.

Ответы [ 3 ]

4 голосов
/ 22 июля 2011
  1. Ваша логика неверна, потому что .find () возвращает -1, если строка не найдена, и -1 является значением истинного значения, поэтому ваш код будет думать, что в каждой строке содержится <A>.

  2. Вам не нужно создавать новую подстроку, чтобы найти '</W>', потому что .find () также имеет необязательный аргумент начала.

  3. Ни одно из этих объяснений не объясняет, почему вам не хватает памяти. У вас необычно маленький компьютер с памятью?

  4. Вы уверены, что показываете нам весь код?

РЕДАКТИРОВАНИЕ: Хорошо, теперь я думаю, что ваш файл содержит только одну строку.

Попробуйте изменить код следующим образом:

with open('/Users/Desktop/Poetrylist.txt','w') as output_file:
    with open('/Users/Desktop/2e.txt','r') as open_file:
        the_whole_file = open_file.read()
        start_position = 0
        while True:
            start_position = the_whole_file.find('<A>', start_position)
            if start_position < 0:
                break
            start_position += 3
            end_position = the_whole_file.find('</W>', start_position)
            output_file.write(the_whole_file[start_position:end_position])
            output_file.write("\n")    
            start_position = end_position + 4
2 голосов
/ 22 июля 2011

Я думаю, что у вас могут возникнуть проблемы с окончаниями строк. iter(open_file) должен возвращать каждую строку отдельно, но он может неправильно угадать терминатор строки, который изменяется от os к os. Вы можете заставить python трактовать любое окончание строки для любой ОС как конец строки для целей readlines / iter, добавив "U" к флажкам open. Попробуйте это:

with open('/Users/Desktop/2e.txt','rU') as open_file:
#                                   ^

с остальными все так же. (комментарий добавлен для акцента).

1 голос
/ 22 июля 2011

Вы уверены, что будете использовать

, если each_line.find (''):

find () возвращает -1, если подстрока не найдена, таким образомдаже если у вас нет совпадений, условие будет истинным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...