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

时间:2013-11-25 17:21:42

标签: 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']

但是,请使用以下内容:

line = line.split(",")
line = line.split(" ")

无法正常工作,因为它会在空间或空间中将它们分开,并且会有以下值:

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

有什么方法可以解决这个问题吗?

5 个答案:

答案 0 :(得分:4)

首先在,处拆分然后迭代该列表并在每个空格处分割。如果在空格分割后返回的项目数超过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']

答案 1 :(得分:3)

以下是使用正则表达式的解决方案:

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')]

答案 2 :(得分:1)

有很好的re - 解决方案,但我只是想添加这个非正则表达式解决方案:

>>> 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']

您可以使用sum代替itertools.chain,而不是>>> 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(',')))

或更好

{{1}}

答案 3 :(得分:0)

正则表达方式。 : - )

>>> s = "John Smith,M,23 Ashley Jones,F,18 James Smith Johns,M,20" #Note: no title here.
>>> [(x.group(1), x.group(3), x.group(4)) for x in re.finditer(r"(\S+( \S+)),(\S),(\d+)",s)]
[('John Smith', 'M', '23'), ('Ashley Jones', 'F', '18'), ('Smith Johns', 'M', '20')]

请注意,我已删除标题(第一行),您需要相应地修改正则表达式,或修改输入字符串。

答案 4 :(得分:-1)

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