/Users/kiddo/anaconda/lib/python3.6/site-packages/nltk/corpus/reader/wordlist.py:28: ResourceWarning: arquivo não fechado <_io.bufferedreader i = "4">
return concat ([self.open (f) .read () para f em fileids])
Esse é um aviso que encontrei no modo de depuração. Achei que você gostaria de consertar isso antes do próximo lançamento.
Olá, posso resolver este problema?
@iliaschalkidis @alvations Como posso reproduzir o aviso no linux?
@ sks4903440 Usando a versão 3.2.5, você pode tentar executar o seguinte script em sua linha de comando:
test.py
import warnings
import nltk
warnings.filterwarnings('error', category=ResourceWarning)
stop_words = nltk.corpus.stopwords.words('english')
$ python test.py
Voce deveria pegar:
ResourceWarning: unclosed file <_io.BufferedReader name='/Users/kiddo/nltk_data/corpora/stopwords/english'>
Fixado em # 1945
Hmmm .. Herdar o io.BufferedReader
para o StreamCorpusReader é uma solução interessante, mas talvez fechar o arquivo corretamente com os gerenciadores de contexto with
escopo possa ser uma solução melhor.
E acho que o Python3.6 tem alguns requisitos especiais para arquivos que são diferentes das versões anteriores. Temos que ler o log de alterações do CPython para ter certeza de que o que estamos fazendo não é apenas um bandaid =)
@alvations Usar with
certamente seria uma boa ideia. Eu tentaria incorporar isso. Como no CPython, o coletor de lixo fecha automaticamente o arquivo após zero contagens de referência, eu não tinha usado isso. Além disso, para que a instrução with
funcione, teremos que usar io.BufferedReader
ou implementar os métodos __enter__
e __exit__
. O que você acha que é melhor?
~ Acho que não temos que implementar os métodos de entrada / saída, pois não herdaremos do BufferedReader, mas usar o contexto para abrir e fechar e, em seguida, deixar o módulo io
manipular o gc (coleta de lixo ). ~
Isso é complicado, o io.BufferedReader
já tem a função seek()
like e quando SeekableUnicodeStreamReader
herda disso sem fazer nenhum super __init__()
, não tenho certeza o que está tirando do BufferedReader.
E, na verdade, não podemos realmente envolver with
dentro de read()
porque isso impedirá que as funções de busca e indicação funcionem, a menos que hackemos o buffer dentro do contexto with
. Hmm...
Alguma novidade sobre isso? O Python 3.6 ainda reclama do NLTK 3.3 em praticamente todos os recursos:
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1107: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/lexnames'>
for i, line in enumerate(self.open('lexnames')):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1159: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/index.adj'>
for i, line in enumerate(self.open('index.%s' % suffix)):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1159: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/index.adv'>
for i, line in enumerate(self.open('index.%s' % suffix)):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1159: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/index.noun'>
for i, line in enumerate(self.open('index.%s' % suffix)):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1159: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/index.verb'>
for i, line in enumerate(self.open('index.%s' % suffix)):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1209: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/adj.exc'>
for line in self.open('%s.exc' % suffix):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1209: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/adv.exc'>
for line in self.open('%s.exc' % suffix):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1209: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/noun.exc'>
for line in self.open('%s.exc' % suffix):
/home/user/py36/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py:1209: ResourceWarning: unclosed file <_io.BufferedReader name='/home/user/nltk_data/corpora/wordnet/verb.exc'>
Correção proposta: https://github.com/nltk/nltk/pull/2165
Outro problema que parece ter sido concluído, pode ser bom encerrar o problema.
Obrigado a todos por levantar o problema e @purificant pela correção!
Comentários muito úteis
Alguma novidade sobre isso? O Python 3.6 ainda reclama do NLTK 3.3 em praticamente todos os recursos: