#python #loops #text #gensim
#python #циклы #текст #gensim
Вопрос:
Я работаю над моделью LDA с помощью gensim. Для этого я в основном открываю текстовые файлы, создаю словарь, а затем запускаю модель.
Чтобы открыть файлы, я использую это:
files = [codecs.open(infile, 'r', 'utf-16', 'ignore') for infile in sample_list]
в котором sample_list — это список путей к файлам. Мне нужно использовать codecs.open, потому что тексты на другом языке (и я не обновлял Python).
Моя проблема в том, что я не знаю, как закрыть все файлы после их использования. Есть идеи? Я попробовал пару вещей. Я не могу использовать здесь обычный цикл, потому что мой следующий шаг:
texts = [" ".join(file.readlines()[0:]) for file in files]
Когда я использую более 5000 файлов, я получаю сообщение об ошибке «IOError: [Errno 24] Слишком много открытых файлов», я думаю, что я мог бы открывать несколько файлов одновременно, объединять их, закрывать и повторять. Кроме того, держать файлы открытыми просто плохо.
Спасибо!
Комментарии:
1. Как вы используете файлы
2. Я маркирую текст каждого файла, затем вычисляю частоту слов и удаляю наиболее распространенные токены (я уже выполнил другую предварительную обработку, например, устранение стоп-слов, знаков препинания и т. Д.), Затем создаю словарь и запускаю модель LDA с модулем gensim.
Ответ №1:
def read_contents(filename):
with codecs.open(filename, 'r', 'utf-16', 'ignore') as infile:
return ' '.join(infile)
texts = [read_contents(filename) for filename in sample_list]
Использование with
эквивалентно выполнению:
def read_contents(filename):
try:
infile = codecs.open(filename, 'r', 'utf-16', 'ignore')
return ' '.join(infile)
finally:
infile.close()
finally
Ключевое слово гарантирует, что close()
оно будет выполнено независимо от того, что, даже если скрипт выдает ошибку внутри try
.
Комментарии:
1. 1 для наилучшей практики обработки файлов. Я действительно не думаю, что новичкам в Python так сложно разобраться, и меня очень раздражают все вводные материалы, которые этого не делают.
2. Спасибо! Это позволяет мне открывать 5000 файлов одновременно, поэтому он кажется более эффективным, чем код, который я предоставил. В функцию я добавил filename.close() прямо под строкой возврата, чтобы закрыть файлы. Что вы думаете?
3. @Connie: Для этого
with
и предназначен. Вызовclose
себя подвержен ошибкам иwith
не является необходимым. (Кроме того, если вы добавили его ниже возврата, он даже не запустится. Подвержен ошибкам, смотрите!)4. Приятно знать! Тогда я начну использовать
with
чаще.5. @Connie это не открывает их одновременно, каждый файл закрывается после его использования, поэтому у вас есть только 1 открытый одновременно. поскольку вам не нужно одновременно открывать более одного, к такому поведению вы стремитесь