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

2024-04-29 19:01:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.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'

有办法解决这个问题吗?你知道吗


Tags: 文件csv数据方法nameagelinejohn
3条回答

有一些不错的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(',')))

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

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

首先在,处拆分,然后遍历该列表并在空白处拆分每个项。如果在空格处拆分后返回的项目数大于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']

相关问题 更多 >