我怎样才能让 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返回的文件对象一样=]
关于让 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返回的文件对象一样=]