Python - 将一行拆分成多列 - csv 数据

3

我正在尝试从CSV文件中读取数据,并将每一行拆分成相应的列。

但是当某个列内包含逗号时,我的正则表达式会出错。

例如:a,b,c,"d,e,g,",f

我希望得到的结果如下:

a    b    c    "d,e, g,"    f  

这里有一列,共5列。

我使用以下正则表达式通过逗号分隔字符串:

,(?=(?:"[^"]?(?:[^"])*))|,(?=[^"]+(?:,)|,+|$)

但它对某些字符串无效,而对其他字符串有效。

我的目标是,当我使用pyspark从csv读取数据并将其加载到数据框/ RDD中时,我希望能够加载/保留所有列,而不会出现任何错误。

谢谢


如果有多个现成的选项可用,为什么还要费心呢?https://dev59.com/0l4b5IYBdhLWcg3wtjk_#34528938 - zero323
3个回答

4

在新的regex模块的帮助下,这将变得更加容易:

import regex as re

string = 'a,b,c,"d,e, g,",f'
rx = re.compile(r'"[^"]*"(*SKIP)(*FAIL)|,')

parts = rx.split(string)
print(parts)
# ['a', 'b', 'c', '"d,e, g,"', 'f']

它支持(*SKIP)(*FAIL)机制,该机制忽略此示例中双引号之间的所有内容。


如果您转义了双引号,可以使用以下方式:

import regex as re

string = '''a,b,c,"d,e, g,",f, this, one, with "escaped \"double",quotes:""'''
rx = re.compile(r'".*?(?<!\\)"(*SKIP)(*FAIL)|,')
parts = rx.split(string)
print(parts)
# ['a', 'b', 'c', '"d,e, g,"', 'f', ' this', ' one', ' with "escaped "double",quotes:""']

您可以在regex101.com上看到后者的演示。


对于接近50个点,我认为也应该提供csv方法:

import csv
string = '''a,b,c,"d,e, g,",f, this, one, with "escaped \"double",quotes:""'''

# just make up an iterable, normally a file would go here
for row in csv.reader([string]):
    print(row)
    # ['a', 'b', 'c', 'd,e, g,', 'f', ' this', ' one', ' with "escaped "double"', 'quotes:""']

3

3

使用正则表达式无法轻松解析CSV文件。

处理Unix命令行中的CSV文件时,我通常使用csvkit工具包,可以从https://csvkit.readthedocs.io获取。它还有一个Python库。

标准csv库的Python文档在此:https://docs.python.org/2/library/csv.html

这里有关于解析CSV的广泛讨论:

https://softwareengineering.stackexchange.com/questions/166454/can-the-csv-format-be-defined-by-a-regex

这是一条经过验证的途径,且库文件足够优秀,您不需要自己编写代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接