/Users/kiddo/anaconda/lib/python3.6/site-packages/nltk/corpus/reader/wordlist.py:28: ResourceWarning: archivo sin cerrar <_io.bufferedreader i = "4">
return concat ([self.open (f) .read () para f en fileids])
Esa es una advertencia que encontré en el modo de depuración. Pensé que tal vez te gustaría arreglar eso antes del próximo lanzamiento.
Hola, ¿puedo atender este problema?
@iliaschalkidis @alvations ¿Cómo puedo reproducir la advertencia en linux?
@ sks4903440 Con la versión 3.2.5, puede intentar ejecutar el siguiente script en su línea de comando:
test.py
import warnings
import nltk
warnings.filterwarnings('error', category=ResourceWarning)
stop_words = nltk.corpus.stopwords.words('english')
$ python test.py
Deberías conseguir:
ResourceWarning: unclosed file <_io.BufferedReader name='/Users/kiddo/nltk_data/corpora/stopwords/english'>
Corregido en # 1945
Hmmm .. Heredar el io.BufferedReader
al StreamCorpusReader es una solución interesante, pero quizás cerrar el archivo correctamente con los administradores de contexto with
scope podría ser una mejor solución.
Y creo que Python3.6 tiene algunos requisitos especiales para archivos que son diferentes de las versiones anteriores. Tenemos que leer el registro de cambios de CPython para estar seguros de que lo que estamos haciendo no es solo una curita =)
@alvations Usar with
seguramente sería una buena idea. Intentaría incorporar eso. Dado que en CPython, el recolector de basura cierra automáticamente el archivo después de cero recuentos de referencias, no lo había usado. También para que funcione la instrucción with
, tendremos que usar io.BufferedReader
o implementar los métodos __enter__
y __exit__
. ¿Qué piensas que es mejor?
~ Creo que no tenemos que implementar los métodos de entrada / salida ya que no heredaremos del BufferedReader, sino que usaremos el contexto para abrir y cerrar y luego dejar que el módulo io
maneje el gc (recolección de basura ). ~
Esto es complicado, el io.BufferedReader
ya tiene la función seek()
like y cuando SeekableUnicodeStreamReader
hereda de eso sin hacer ningún super __init__()
, no estoy exactamente seguro lo que está tomando de BufferedReader.
Y de hecho, no podemos realmente envolver el with
dentro del read()
porque eso evitará que las funciones de buscar y decir funcionen a menos que pirateemos el búfer dentro del contexto with
. Mmmm ...
¿Alguna noticia sobre esto? Python 3.6 todavía se queja de NLTK 3.3, en casi todos los 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'>
Solución propuesta: https://github.com/nltk/nltk/pull/2165
Otro tema que parece que se ha completado, podría ser bueno cerrar el tema.
¡Gracias a todos por plantear el problema y a @purificant por la solución!
Comentario más útil
¿Alguna noticia sobre esto? Python 3.6 todavía se queja de NLTK 3.3, en casi todos los recursos: