解析单个 CSV 字符串?

Posted

技术标签:

【中文标题】解析单个 CSV 字符串?【英文标题】:Parse a single CSV string? 【发布时间】:2016-06-19 18:26:40 【问题描述】:

有没有一种方法可以解析单个逗号分隔的字符串,而无需使用像 csv.reader(..) 这样的花哨的东西?我可以使用split(',') 函数,但是当有效的列值本身包含逗号时,它不起作用。 csv 库有用于解析正确处理上述特殊情况的 CSV 文件的阅读器,但我不能使用它们,因为我只需要解析一个字符串。但是,如果 Python CSV 允许自己解析单个字符串,那么这对我来说就是新闻。

【问题讨论】:

【参考方案1】:

仔细查看csv 模块的文档,其中 说:

reader(...)
    csv_reader = reader(iterable [, dialect='excel']
                            [optional keyword args])
        for row in csv_reader:
            process(row)

    The "iterable" argument can be any object that returns a line
    of input for each iteration, such as a file object or a list.  The
    optional "dialect" parameter is discussed below.  The function
    also accepts optional keyword arguments which override settings
    provided by the dialect.

所以如果你有字符串:

>>> s = '"this is", "a test", "of the csv", "parser"'

你想要“一个对象,它为每个对象返回一行输入 迭代”,你可以把你的字符串包装在一个列表中:

>>> r = csv.reader([s])
>>> list(r)
[['this is', 'a test', 'of the csv parser']]

这就是您使用 csv 模块解析字符串的方式。

【讨论】:

我想使用iter(s) 作为通用迭代器而不是[s](指定一个列表)会更优雅。但你有我的 +1 如果字符串在值内引用了换行符,这可能不起作用; @alecxe 的回答更有意义 list(csv.reader(['"this is", "a test", "of the csv", "parser"']))[0] 轰隆隆!【参考方案2】:

您仍然可以使用 csv 解析单个字符串。使用StringIO写入字符串buffer(也称为内存文件):

import csv
from StringIO import StringIO

s = "your string"
buff = StringIO(s)

reader = csv.reader(buff)
for line in reader:
    print(line)

【讨论】:

对于 Python 3 使用 from io import StringIO 见 here 但要小心非 ASCII 字符串! '如果使用 [Unicode 和 8 位字符串],则无法解释为 7 位 ASCII(使用第 8 位)的 8 位字符串将导致调用 getvalue() 时引发 UnicodeError。 '【参考方案3】:
>>> import csv
>>> s = '"Yes, this line",can be, parsed as csv'
>>> list(csv.reader([s]))[0]
['Yes, this line', 'can be', ' parsed as csv']
>>>

基本上只是上面的@larsks 回答,但更简短,并证明它适用于引号内有逗号的 csv 值。

如果你给我点赞,也给其他答案点赞。 https://***.com/a/35822856/1196339

【讨论】:

【参考方案4】:

Pandas DataFrame 的字符串:

import pandas as pd
from io import StringIO

csv_str="Column1,Column2\n1,2\n3,4"

buff = StringIO(csv_str)
df = pd.read_csv(buff)

数据帧:

Out[1]: 
   Column1  Column2
         1        2
         3        4

对于其他分隔符,将 delimiter="\t" 之类的内容添加到 read_csv()

【讨论】:

以上是关于解析单个 CSV 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

解析csv文件中的json字符串[重复]

CSV 解析包含双引号和逗号的字符串

将 CSV 字符串解析为整数数组

sql 解析CSV字符串。

字符串 CSV解析 表格 逗号分隔值

我可以使用 Text::CSV_XS 解析 csv 格式的字符串而不将其写入磁盘吗?