Python — закрытие набора текстовых файлов, открытых одновременно с пониманием списка

#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 открытый одновременно. поскольку вам не нужно одновременно открывать более одного, к такому поведению вы стремитесь