将每个名称的最后三个条目写入文件中
Write last three entries per name in a file
我的文件中有以下数据:
Sarah,10
John,5
Sarah,7
Sarah,8
John,4
Sarah,2
我想为每个人保留最后三行。输出将是:
John,5
Sarah,7
Sarah,8
John,4
Sarah,2
在这个例子中,Sarah 的第一行被删除了,因为后面的三行。输出中的行也保持与输入中的行相同的顺序。我该怎么做?
附加信息
你们都很棒-非常感谢。似乎已从此 post 中删除的最终代码是 -
import collections
with open("Class2.txt", mode="r",encoding="utf-8") as fp:
count = collections.defaultdict(int)
rev = reversed(fp.readlines())
rev_out = []
for line in rev:
name, value = line.split(',')
if count[name] >= 3:
continue
count[name] += 1
rev_out.append((name, value))
out = list(reversed(rev_out))
print (out)
因为这看起来像 csv 数据,所以使用 csv
模块来读写它。当您阅读每一行时,存储按第一列分组的行。将行号与行一起存储,以便它们可以按照与输入相同的顺序写出。使用绑定双端队列只保留每个名称的最后三行。最后对行进行排序,写出来
import csv
by_name = defaultdict(lambda x: deque(x, maxlen=3))
with open('my_data.csv') as f_in
for i, row in enumerate(csv.reader(f_in)):
by_name[row[0]].append((i, row))
# sort the rows for each name by line number, discarding the number
rows = sorted(row[1] for value in by_name.values() for row in value, key=lambda row: row[0])
with open('out_data.csv', 'w') as f_out:
csv.writer(f_out).writerows(rows)
我的文件中有以下数据:
Sarah,10
John,5
Sarah,7
Sarah,8
John,4
Sarah,2
我想为每个人保留最后三行。输出将是:
John,5
Sarah,7
Sarah,8
John,4
Sarah,2
在这个例子中,Sarah 的第一行被删除了,因为后面的三行。输出中的行也保持与输入中的行相同的顺序。我该怎么做?
附加信息 你们都很棒-非常感谢。似乎已从此 post 中删除的最终代码是 -
import collections
with open("Class2.txt", mode="r",encoding="utf-8") as fp:
count = collections.defaultdict(int)
rev = reversed(fp.readlines())
rev_out = []
for line in rev:
name, value = line.split(',')
if count[name] >= 3:
continue
count[name] += 1
rev_out.append((name, value))
out = list(reversed(rev_out))
print (out)
因为这看起来像 csv 数据,所以使用 csv
模块来读写它。当您阅读每一行时,存储按第一列分组的行。将行号与行一起存储,以便它们可以按照与输入相同的顺序写出。使用绑定双端队列只保留每个名称的最后三行。最后对行进行排序,写出来
import csv
by_name = defaultdict(lambda x: deque(x, maxlen=3))
with open('my_data.csv') as f_in
for i, row in enumerate(csv.reader(f_in)):
by_name[row[0]].append((i, row))
# sort the rows for each name by line number, discarding the number
rows = sorted(row[1] for value in by_name.values() for row in value, key=lambda row: row[0])
with open('out_data.csv', 'w') as f_out:
csv.writer(f_out).writerows(rows)