Python 比较文件中两行的特定列
检查文件中第1列和第2列的2行是否具有相同的值,如果没有,则将该行添加到另一个“输出”文件,如果相同,则根据第三列(时间戳),将最近的一行添加到“输出”文件 下面的代码段比较的是完整的行,而不是列,如何对列进行比较Python 比较文件中两行的特定列,python,file,csv,Python,File,Csv,检查文件中第1列和第2列的2行是否具有相同的值,如果没有,则将该行添加到另一个“输出”文件,如果相同,则根据第三列(时间戳),将最近的一行添加到“输出”文件 下面的代码段比较的是完整的行,而不是列,如何对列进行比较 #!/usr/bin/python import os,sys,csv file_open= sys.argv[1] with open (file_open,'r') as f1, open ('output.txt','w+') as f2: lines2 =
#!/usr/bin/python
import os,sys,csv
file_open= sys.argv[1]
with open (file_open,'r') as f1, open ('output.txt','w+') as f2:
lines2 = f2.readlines()
for line in f1:
if line not in lines2:
f2.write(line)
输入
预期产量
由于您正在导入
csv
模块,我建议您使用它
import sys
import csv
seen = set()
file_open = sys.argv[1]
with open(file_open, 'r') as f1, open('output.txt','w') as f2:
reader = csv.reader(f1)
writer = csv.writer(f2)
for line in reader:
if not len(line): # a quick check to make sure it's a valid line
continue
if (line[0], line[1]) not in seen:
seen.add((line[0], line[1]))
writer.writerow(line)
这段代码进行检查,以确保在写入具有相同第一列和第二列的行之前,尚未看到该行。元组是可散列的,所以这很简单
输出:
1,A,28/04/17 10:57:28.096
3,A,28/04/17 10:57:46.950
4,A,28/04/17 11:03:09.432
的修改版本,使用OrderedDict
根据时间戳保留最新条目(假设时间戳按顺序出现)
output.txt的内容
:
1,A,28/04/17 10:59:16.969
3,A,28/04/17 11:02:09.341
4,A,28/04/17 11:03:09.432
使用
itertools.groupby()
函数和datetime
模块的简短解决方案(用于比较日期字符串):
输出.csv内容:
1,A,28/04/17 10:59:16.969
3,A,28/04/17 11:02:09.341
4,A,28/04/17 11:03:09.432
您导入但不使用的模块应该允许您处理类似ListScope的行。是否有两行以上的行具有共享列?@Nullman我知道,一个代码示例可能会有所帮助。@RomanPerekhrest是的,可以有任意数量的行。为什么downovote???@HARSHITKHURANA干杯,很高兴知道它有帮助。它不按时间排序,它保留较早的条目而不是最新的条目。这并不能解决问题。也许这只是问题的一部分。谢谢,但我认为没有必要。这是有益的,因为还有更多的列要按原样打印,但这只打印3列。我怎样才能改变这一点?我试图理解您的解决方案,但无法使其工作。。它引发错误:“ValueError:时间数据“”与格式“%d/%m/%y%H:%m:%S.%f”不匹配,请提供帮助。
import sys
import csv
from collections import OrderedDict
history = OrderedDict()
file_open = sys.argv[1]
with open(file_open, 'r') as f1, open('output.txt','w') as f2:
reader = csv.reader(f1)
writer = csv.writer(f2)
for line in reader:
if not len(line): # valid line check
continue
history[(line[0], line[1])] = line[2] # Adds if present, updates if new
for line in list(history.items()):
writer.writerow([line[0][0], line[0][1], line[1]])
1,A,28/04/17 10:59:16.969
3,A,28/04/17 11:02:09.341
4,A,28/04/17 11:03:09.432
import sys, csv, itertools, datetime, operator
with open(sys.argv[1], 'r') as in_csv, open('output.csv', 'w') as out_csv:
reader = csv.reader(in_csv)
lines = [ max(g, key=lambda x: datetime.datetime.strptime(x[2], '%d/%m/%y %H:%M:%S.%f'))
for k,g in itertools.groupby(sorted(reader, key=lambda r: (r[0], r[1])), key=operator.itemgetter(0,1))]
writer = csv.writer(out_csv, lineterminator='\n')
for l in lines:
writer.writerow(l)
1,A,28/04/17 10:59:16.969
3,A,28/04/17 11:02:09.341
4,A,28/04/17 11:03:09.432