Как заставить arff.loadarff работать с urllib.request для чтения файла arff с URL? - PullRequest
0 голосов
/ 28 декабря 2018

Есть идеи о том, как заставить arff.loadarff работать с URL?Я пытаюсь прочитать файл arff по следующему URL-адресу [с помощью Python 3.7]: https://archive.ics.uci.edu/ml/machine-learning-databases/00327/Training%20Dataset.arff

Я пробовал несколько методов, и центральная проблема заключается в получении urllib.request для возврата файла или файла, похожего наобъект, так что arff.loadarff может распознать его и прочитать его правильно.

Вот кое-что из того, что я пробовал, и результаты:

from scipy.io import arff
import urllib.request

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00327/Training%20Dataset.arff"
response = urllib.request.urlopen(url)
data, meta = arff.loadarff(response)

Это дает ошибку TypeError, потому что urlopen возвращает aобъект ответа.

Я также пытался следовать решениям в принятом ответе здесь :

from scipy.io import arff
import urllib.request
import codecs

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00327/Training%20Dataset.arff"
ftpstream = urllib.request.urlopen(url)
data, meta = arff.loadarff(codecs.iterdecode(ftpstream, 'utf-8'))

, но это также дает ошибку TypeError, поскольку codecs.iterdecode возвращаетгенератор.И вот этот:

from scipy.io import arff
import urllib.request

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00327/Training%20Dataset.arff"
ftpstream = urllib.request.urlopen(url)
data, meta = arff.loadarff(ftpstream.read().decode('utf-8'))

При этом происходит доступ к файлу в виде строки, но возвращается полный файл arff в качестве имени файла, и я получаю сообщение об ошибке, что имя файла слишком длинное.

1 Ответ

0 голосов
/ 28 декабря 2018

Ты почти у цели.loadarff() нужен объект, подобный текстовому файлу, который не удовлетворяет ни urlopen(), ни результат decode().Таким образом, способ сделать это состоит в том, чтобы обернуть содержимое текстовой строки в файл-подобный объект, используя io.StringIO():

from scipy.io import arff
import urllib.request
import io # for io.StringIO()

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00327/Training%20Dataset.arff"
ftpstream = urllib.request.urlopen(url)
data, meta = arff.loadarff(io.StringIO(ftpstream.read().decode('utf-8')))

Файловый объект здесь означает что-то x, которое может сделать x.read() ивозвращает строку, так же, как объект файла, возвращаемый open(filename)

...