【问题标题】:Python csv string to arrayPython csv字符串到数组
【发布时间】:2011-03-19 08:50:30
【问题描述】:

有人知道一个简单的库或函数来解析 csv 编码的字符串并将其转换为数组或字典吗?

我不认为我想要内置的 csv module,因为在我看到的所有示例中,都使用文件路径,而不是字符串。

【问题讨论】:

    标签: python string arrays csv


    【解决方案1】:

    不是通用 CSV 解析器,但可用于带有逗号的简单字符串。

    >>> a = "1,2"
    >>> a
    '1,2'
    >>> b = a.split(",")
    >>> b
    ['1', '2']
    

    解析 CSV 文件:

    f = open(file.csv, "r")
    lines = f.read().split("\n") # "\r\n" if needed
    
    for line in lines:
        if line != "": # add other needed checks to skip titles
            cols = line.split(",")
            print cols
    

    【讨论】:

    • '简单胜于复杂!'
    • -1 此解决方案的问题是它没有考虑“字符串转义”,即3, "4,5,6, 6 应被视为三个字段而不是五个字段。
    • 简单但仅在某些特定情况下有效,这不是通用的CSV解析代码
    【解决方案2】:

    您可以使用io.StringIO 将字符串转换为文件对象,然后将其传递给csv 模块:

    from io import StringIO
    import csv
    
    scsv = """text,with,Polish,non-Latin,letters
    1,2,3,4,5,6
    a,b,c,d,e,f
    gęś,zółty,wąż,idzie,wąską,dróżką,
    """
    
    f = StringIO(scsv)
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        print('\t'.join(row))
    

    在换行符上带有split() 的更简单版本:

    reader = csv.reader(scsv.split('\n'), delimiter=',')
    for row in reader:
        print('\t'.join(row))
    

    或者你可以简单地将split()这个字符串分成几行,使用\n作为分隔符,然后split()每一行变成值,但是这样你必须注意引用,所以最好使用csv模块。

    Python 2 上,您必须将 StringIO 导入为

    from StringIO import StringIO
    

    改为。

    【讨论】:

    • 如果他的 csv 文件包含包含逗号的字符串,则拆分方法将不起作用
    • 或引用字符串作为值(带或不带逗号)
    • Python 3 现在使用 io.StringIO。 (希望能为 Python 3 用户节省一点时间)。所以导入 io 和 io.StringIO。
    • 您可以使用.split('\n'),而不是.splitlines()
    • 不,它非常适用于带有 ogonki 的波兰字母 :-)
    【解决方案3】:

    the documentation:

    虽然该模块不直接支持解析字符串,但可以轻松完成:

    import csv
    for row in csv.reader(['one,two,three']):
        print row
    

    只需将您的字符串转换为单个元素列表。

    当这个示例在文档中明确显示时,导入 StringIO 对我来说似乎有点过分。

    【讨论】:

      【解决方案4】:

      csv.reader()https://docs.python.org/2/library/csv.html 的官方文档非常有帮助,上面写着

      文件对象和列表对象都合适

      import csv
      
      text = """1,2,3
      a,b,c
      d,e,f"""
      
      lines = text.splitlines()
      reader = csv.reader(lines, delimiter=',')
      for row in reader:
          print('\t'.join(row))
      

      【讨论】:

        【解决方案5】:

        使用它来将 csv 加载到列表中

        import csv
        
        csvfile = open(myfile, 'r')
        reader = csv.reader(csvfile, delimiter='\t')
        my_list = list(reader)
        print my_list
        >>>[['1st_line', '0'],
            ['2nd_line', '0']]
        

        【讨论】:

          【解决方案6】:

          这里有一个替代解决方案:

          >>> import pyexcel as pe
          >>> text="""1,2,3
          ... a,b,c
          ... d,e,f"""
          >>> s = pe.load_from_memory('csv', text)
          >>> s
          Sheet Name: csv
          +---+---+---+
          | 1 | 2 | 3 |
          +---+---+---+
          | a | b | c |
          +---+---+---+
          | d | e | f |
          +---+---+---+
          >>> s.to_array()
          [[u'1', u'2', u'3'], [u'a', u'b', u'c'], [u'd', u'e', u'f']]
          

          这是documentation

          【讨论】:

            【解决方案7】:

            https://docs.python.org/2/library/csv.html?highlight=csv#csv.reader

            csvfile 可以是任何支持迭代器协议并且每次调用 next() 方法时返回一个字符串的对象

            因此,StringIO.StringIO()str.splitlines() 甚至是生成器都很好。

            【讨论】:

              【解决方案8】:

              正如其他人已经指出的那样,Python 包含一个用于读取和写入 CSV 文件的模块。只要输入字符保持在 ASCII 限制范围内,它就可以很好地工作。如果您想处理其他编码,则需要做更多的工作。

              Python documentation for the csv module 实现了 csv.reader 的扩展,它使用相同的接口但可以处理其他编码并返回 unicode 字符串。只需复制并粘贴文档中的代码即可。之后,您可以像这样处理 CSV 文件:

              with open("some.csv", "rb") as csvFile: 
                  for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
                      print row
              

              【讨论】:

              • 确保 Unicode 文件没有 BOM(字节顺序标记)
              • 关于 BOM:Python 应该检测并跳过 UTF-32、UTF-16 等格式的官方 BOM。要跳过 UTF-8 的非官方 Microsoft BOM,请使用 'utf-8-sig' 作为编解码器而不是 'utf-8' .
              【解决方案9】:

              简单 - csv 模块也适用于列表:

              >>> a=["1,2,3","4,5,6"]  # or a = "1,2,3\n4,5,6".split('\n')
              >>> import csv
              >>> x = csv.reader(a)
              >>> list(x)
              [['1', '2', '3'], ['4', '5', '6']]
              

              【讨论】:

              • 很高兴知道,但请记住,如果您的字段包含换行符,.split('\n') 会做一些奇怪的事情。
              • @Inaimathi,如果是csv,里面的换行应该被转义。
              • 如果字段被引用,则不需要转义换行符。
              • 这个功能没有很好的记录。谢谢。
              猜你喜欢
              • 2022-10-18
              • 2013-07-19
              • 2021-06-19
              • 1970-01-01
              • 2021-12-02
              相关资源
              最近更新 更多