使用特定条件从文件中选择行

时间:2012-06-20 17:03:04

标签: python file-io python-2.7

我是Python的新手,我需要帮助:

我有一个包含这些行的文件(见下文)。我想复制此文件中的行,因为某些行具有相似的日期,如果行具有相似的日期,我想选择具有结束列表的数字的最小值的行。

'1990-01-01','f','2'
'1990-01-02','c','4'
'1990-01-01','j','2.5'
'1990-01-01','j','1.5'
'1990-01-02','b','3.9'

1 个答案:

答案 0 :(得分:1)

首先是一些代码:

text_data = """'1990-01-01','f','2'
'1990-01-02','c','4'
'1990-01-01','j','2.5'
'1990-01-01','j','1.5'
'1990-01-02','b','3.9'
"""

import csv
from StringIO import StringIO
from operator import itemgetter
from itertools import groupby


temp = StringIO(text_data)
tabular = list(csv.reader(temp, quotechar="'"))
tabular.sort(key=lambda L: (L[0], float(L[2]))

for key, val in groupby(tabular, itemgetter(0)):
    print next(val) # or do something appropriate

我将文本放在代码中并将其包装在StringIO对象中以模拟文件,但通常可以使用open()在文件上使用csv.reader打开文本。

然后数据按数据列(索引0)和值列(索引2)排序 - 此排序顺序确保相同的日期在一起(我意识到你提到'类似',但这个配方可以调整并且对于每个日期,最低值列首先出现。

itertools.groupby()用于迭代符合某些条件的密钥 - 在符合该条件的条件下,它们位于同一“组”中。 'key'(正在分组的内容)将是日期的值,'val'将是该键中可用值的另一个可迭代值。由于只需要第一个,因此使用next(val)将返回具有最小值的结果。

输出结果为:

['1990-01-01', 'j', '1.5']
['1990-01-02', 'b', '3.9']