Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较文件中两行的特定列_Python_File_Csv - Fatal编程技术网

Python 比较文件中两行的特定列

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 =

检查文件中第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 = 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