你有什么好的办法让arff.loadarff在网址中工作吗?我正在尝试使用Python3.7从以下网址读取arff文件: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返回一个响应对象。
我还尝试遵循接受答案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返回一个生成器。还有这一条:
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文件作为文件名,并且我会收到文件名太长的错误消息。
发布于 2018-12-28 05:46:49
你就快到了。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.read()操作并返回字符串的文件,就像open(filename)返回的x对象一样
https://stackoverflow.com/questions/53951017
复制相似问题