代码之家  ›  专栏  ›  技术社区  ›  rLevv

如何让arff.loadarf使用urllib.request从URL读取arff文件?

  •  0
  • rLevv  · 技术社区  · 7 年前

    有什么好主意吗 arff.loadarff 从URL工作?我尝试从以下URL(使用python 3.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)
    

    这会产生错误类型错误,因为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'))
    

    但这也会导致类型错误,因为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 回复  |  直到 7 年前
        1
  •  2
  •   adrtam    7 年前

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

    推荐文章