嗨,我有一个python代码,可以在将它们解析为out.csv之前从sample_data.csv中获取数据。
请查看图像以更好地查看sample_data.csv
http://i.imgur.com/wwi4RC7.jpg
我的问题是我如何从最后一个next(v)[1]开始
datetime = next(v)[1],next(v)[1],next(v)[1],next(v)[1],next(v)[1]
并从头开始直到行尾,而不是愚蠢地使用多个next(v)[1]?这是一个问题,因为不同的收据具有不同的行数,因此我无法确定交易的next(v)[1]的固定编号
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]
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])
最佳答案
如果我正确理解了这个问题,则可以使用列表推导完成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:] ]
关于python - 提取数据直到最后,而不是使用多个next(v)[1],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39739093/