获取数据直到结束而不是使用多个下一个(v)[1]

时间:2016-09-28 05:59:27

标签: python csv

您好我有一个python代码,可以在将数据解析为out.csv之前从sample_data.csv中获取数据。

请参阅图像以更好地可视化sample_data.csv http://i.imgur.com/wwi4RC7.jpg

我的问题是我如何从

中的最后一个(v)[1]开始
datetime = next(v)[1],next(v)[1],next(v)[1],next(v)[1],next(v)[1]

并一直开始直到行结束而不是愚蠢并使用多个next(v)[1]?这是一个问题,因为不同的收据有不同的行数,因此我不能有下一个(v)[1]的固定号码用于交易

  

transaction = next(v)[1],next(v)[1],   下(V)[1],接下来的(v)的[1],接下来的(v)的[1],接下来的(v)的[1],接下来的(v)的[1],接下来的(v)的[1]

import csv
    from itertools import groupby
    from operator import itemgetter
    import re

    with open("sample_data.csv", "rb") as f, open("out.csv", "wb") as out:
        reader = csv.reader(f)
        next(reader)
        writer = csv.writer(out)
        writer.writerow(["Receipt ID","Name","Address","Date","Time","Items","Amount","Cost","Total"])
        groups = groupby(csv.reader(f), key=itemgetter(0))
        for k, v in groups:
            id_, name = next(v)
            add_date_1, add_date_2 = next(v)[1], next(v)[1]
            combinedaddress = add_date_1+ " " +add_date_2
            datetime = next(v)[1],next(v)[1],next(v)[1],next(v)[1],next(v)[1]
            abcd = str(datetime)
            dateprinter = re.search('(\d\d/\d\d/\d\d\d\d)\s(\d\d:\d\d)', abcd).group(1)
            timeprinter = re.search('(\d\d/\d\d/\d\d\d\d)\s(\d\d:\d\d)', abcd).group(2)

            transaction= next(v)[1], next(v)[1], next(v)[1],next(v)[1],next(v)[1],next(v)[1],next(v)[1],next(v)[1]
            writer.writerow([id_, name, combinedaddress, dateprinter, timeprinter, transaction])

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你可以使用列表推导来完成v中的读取值,如下所示:

transaction = [ x[1] for x in v ]

该代码就像抓住所有剩余的next(v)[1]直到v。

结束

旁注:始终调用next(v)非常难看且不实用,您可以先将v转换为列表,然后使用简单的列表切片来获取内容你想要的:

 v = list(v)
 id_, name = v[0]
 add_date_1, add_date_2 = [x[1] for x in v[1:3]]
 ...
 transaction = [ x[1] for x in v[1234:] ]