【问题标题】:Python Very long string in numpy array [closed]Python numpy数组中的非常长的字符串[关闭]
【发布时间】:2016-11-23 13:28:58
【问题描述】:

我正在使用 data = numpy.recfromtxt('table.csv', delimiter=';', dtype=str) 从 csv 文件中获取数据

表格如下所示:

Name; Birthdate; Biography
John; 1990; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Hanc ergo intuens debet institutum illud quasi signum absolvere. Scrupulum, inquam, abeunti; Quae diligentissime contra Aristonem dicuntur a Chryippo. Quo tandem modo?

Python 和 numpy 似乎对这个长字符串有问题。 有什么想法可以解决这个问题吗?

【问题讨论】:

  • 你在说什么样的问题?你应该澄清这一点。
  • recfromtxt 使用更常见的genfromtxt。第一行有 2 个分隔符。第 2 个有 3 个。您期望有多少个字段?

标签: python arrays csv numpy


【解决方案1】:

你可以使用 Python 的 pandas 包。

这是一个简单的使用思路:

import pandas as pd

data = pd.read_csv("file.csv", delimiter = ";")

希望这是你想要的...

【讨论】:

  • 产生了什么?
【解决方案2】:

请使用 pandas 包从 csv 读取

    import pandas as pd
    data = pd.read_csv('table.csv')

Pandas 也可以处理长字符串。

【讨论】:

    【解决方案3】:

    我在阅读它时没有问题,所以您的问题可能是关于以适合打印的方式对其进行格式化。这里有几个选项。

    >>> import textwrap
    >>> a = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Hanc ergo intuens debet institutum illud quasi signum absolvere. Scrupulum, inquam, abeunti; Quae diligentissime contra Aristonem dicuntur a Chryippo. Quo tandem modo?"
    >>> txt = textwrap.wrap(a, width=70)
    >>> print(("{}\n"*len(txt)).format(*txt))
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Hanc ergo
    intuens debet institutum illud quasi signum absolvere. Scrupulum,
    inquam, abeunti; Quae diligentissime contra Aristonem dicuntur a
    Chryippo. Quo tandem modo?
    

    或者这个……

    >>> txt2 = "\n".join([i for i in txt])
    >>> print(txt2)
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Hanc ergo
    intuens debet institutum illud quasi signum absolvere. Scrupulum,
    inquam, abeunti; Quae diligentissime contra Aristonem dicuntur a
    Chryippo. Quo tandem modo?
    >>>     
    

    【讨论】:

      【解决方案4】:

      错误是:

      In [67]: np.recfromtxt('stack40765849.txt', delimiter=';', dtype=str)
      ---------------------------------------------------------------------------
      ValueError                                Traceback (most recent call last)
      <ipython-input-67-eab6d3192d4d> in <module>()
      ----> 1 np.recfromtxt('stack40765849.txt', delimiter=';', dtype=str)
      
      /usr/lib/python3/dist-packages/numpy/lib/npyio.py in recfromtxt(fname, **kwargs)
         1949     kwargs.setdefault("dtype", None)
         1950     usemask = kwargs.get('usemask', False)
      -> 1951     output = genfromtxt(fname, **kwargs)
         1952     if usemask:
         1953         from numpy.ma.mrecords import MaskedRecords
      ...
      ValueError: Some errors were detected !
          Line #2 (got 4 columns instead of 3)
      

      (注意,recfromtxt 使用的是genfromtxt,这已经讨论了很多。

      问题不在于字符串的长度;它与分隔符的数量有关。第一行(标题?)有 2,建议您需要 3 列或字段。但第 2 行有 3 个;额外的可能是文本的一部分。

      识别字段名称的第一行会产生相同的错误。

      np.recfromtxt('stack40765849.txt', delimiter=';', dtype=str,names=True)
      

      pandas 将其加载为:

      In [74]: data=pandas.read_csv('stack40765849.txt',delimiter=';')
      In [75]: data
      Out[75]: 
            Name                                          Birthdate  \
      John  1990   Lorem ipsum dolor sit amet, consectetur adipi...   
      
                                                    Biography  
      John   Quae diligentissime contra Aristonem dicuntur...  
      

      它没有给出错误,但它看起来不正确。

      ===================

      如果我把文中的;改成.

      In [82]: np.genfromtxt('stack40765849_1.txt', delimiter=';', dtype=None,names=Tr
          ...: ue)
      Out[82]: 
      array((b'John', 1990, b' Lorem ipsum dolor sit amet, consectetur adipiscing elit. Hanc ergo intuens debet institutum illud quasi signum absolvere. Scrupulum, inquam, abeunti. Quae diligentissime contra Aristonem dicuntur a Chryippo. Quo tandem modo?'), 
            dtype=[('Name', 'S4'), ('Birthdate', '<i4'), ('Biography', 'S225')])
      

      我得到一个包含 3 个字段的结构化数组(几乎像一个 recarray);最后一个很长 - 全文。 (b'...' 表示 Py3 中的字节字符串;不会出现在 Py2 显示中。)

      pandas 产生类似的东西:

      In [83]: data=pandas.read_csv('stack40765849_1.txt',delimiter=';')
      In [84]: data
      Out[84]: 
         Name   Birthdate                                          Biography
      0  John        1990   Lorem ipsum dolor sit amet, consectetur adipi...
      

      正确的 Py3 unicode 加载:

      In [91]: np.recfromtxt('stack40765849_1.txt', delimiter=';', dtype='U4,i,U255',n
          ...: ames=True)
      Out[91]: 
      rec.array(('John', 1990, ' Lorem ipsum dolor sit amet, consectetur adipiscing elit. Hanc ergo intuens debet institutum illud quasi signum absolvere. Scrupulum, inquam, abeunti. Quae diligentissime contra Aristonem dicuntur a Chryippo. Quo tandem modo?'), 
                dtype=[('Name', '<U4'), ('Birthdate', '<i4'), ('Biography', '<U255')])
      In [92]: 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        • 2018-01-19
        • 1970-01-01
        相关资源
        最近更新 更多