Python 如何在.csv文件中分离数据?

Python 如何在.csv文件中分离数据?,python,list,csv,split,Python,List,Csv,Split,我有一个.csv文件,其中包含一长行数据。数据大致如下所示: Name,Gender,Age John Smith,M,23 Ashley Jones,F,18 James Smith Johns,M,20 我的最终目标是分离所有数据,以便将它们放入行中。我的预期结果是: ['Name','Gender','Age','John Smith','M','23','Ashley Jones','F','18','James Smith Jones','M','20'] 但是,使用以下方法: l

我有一个.csv文件,其中包含一长行数据。数据大致如下所示:

Name,Gender,Age John Smith,M,23 Ashley Jones,F,18 James Smith Johns,M,20
我的最终目标是分离所有数据,以便将它们放入行中。我的预期结果是:

['Name','Gender','Age','John Smith','M','23','Ashley Jones','F','18','James Smith Jones','M','20']
但是,使用以下方法:

line = line.split(",")
line = line.split(" ")
将不起作用,因为它将在或空间将它们分开,并且会有如下值:

'Age John Smith' or 'Age','John','Smith'

有什么办法解决这个问题吗?

正如我在示例中看到的,行将是
line=line.split(“,”)
enow。也许我没有得到什么?

首先在
处拆分,
然后遍历该列表并在空白处拆分每个项目。如果在空格处拆分后返回的项目数大于1,则分别返回第一个项目和其余项目,否则只返回第一个项目

import csv
def solve(row):
    for item in row:
        spl = item.split(None, 1)
        if len(spl) > 1:
            yield spl[0]
            yield spl[1]           
        else:
            yield spl[0]
...             
with open('abc1') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:      
        print list(solve(row))
...         
['Name', 'Gender', 'Age', 'John Smith', 'M', '23', 'Ashley Jones', 'F', '18', 'James Smith Johns', 'M', '20']

下面是一个使用正则表达式的解决方案:

re.compile("([^,]+),([^,]+),(\d+|Age)\s+").findall("Name,Gender,Age John Smith,M,23 Ashley Jones,F,18 James Smith Johns,M,20")
其结果将是:

[('Name', 'Gender', 'Age'), ('John Smith', 'M', '23'), ('Ashley Jones', 'F', '18')]

一种正则表达式方式。:-)


请注意,我已经删除了标题(第一行),您需要相应地修改regexp,或者修改输入字符串。

有一些不错的
re
-解决方案,但我只想添加这个非regex解决方案:

>>> s = "John Smith,M,23 Ashley Jones,F,18 James Smith Johns,M,20"
>>> sum((item.split(None, 1) for item in s.split(',')), list())
['Name', 'Gender', 'Age', 'John Smith', 'M', '23', 'Ashley Jones', 'F', '18', 'James Smith Johns', 'M', '20']
您也可以使用
itertools.chain
,而不是
sum
。但最终,它似乎一点也不短

>>> list(itertools.chain(*[item.split(None, 1) for item in s.split(',')]))
或者更好

>>> list(itertools.chain.from_iterable(item.split(None, 1) for item in s.split(',')))

有些值用空格分隔。阅读他的文章的结尾。如果你真的想将部分
18詹姆斯·史密斯·约翰
分成两个值
18
詹姆斯·史密斯·约翰
,那么你可能需要一些额外的逻辑。回答不错。不过有一个想法:您可以使用
spl=item.split(None,1)
(maxplit=1)。因此,您不必在之后加入元素。这不是一个真正合适的csv文件,因为它是一个大行(
for row in reader
只迭代一次)。因此,在本例中,
csv.reader
只是用逗号拆分的冗长方式。不妨使用
list(solve(f.read().split(','))
。无需编译单用正则表达式——只需使用顶级
re.findall
@StevenRumbalski+1你是对的,这就是我的意思。谢谢你的建议。
>>> list(itertools.chain.from_iterable(item.split(None, 1) for item in s.split(',')))