我怎样才能让 arff.loadarff 与 urllib.request 一起从 URL 读取 arff 文件?

How can I get arff.loadarff to work with urllib.request to read a arff file from a URL?

关于让 arff.loadarff 从 URL 工作的最佳方法有什么想法吗?我正在尝试从以下 URL [使用 Python 3.7] 读取一个 arff 文件:https://archive.ics.uci.edu/ml/machine-learning-databases/00327/Training%20Dataset.arff

我尝试了几种方法,主要问题是将 urllib.request 转换为 return 文件或类似文件的对象,以便 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)

这给出了一个错误类型错误,因为 urlopen return 是一个响应对象。

我也尝试按照已接受答案中的解决方案进行操作 here:

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 return 是一个生成器。还有这个:

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'))

这会以字符串形式访问文件,但 return 将完整的 arff 文件作为文件名,我得到一个文件名太长的错误。

你快到了。 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')))

A file-like object 这里的意思是x可以做x.read()和returns一个字符串,就像open(filename)[=18返回的文件对象一样=]