Python 写了一个读取 2 个文件,比较第一行的脚本,横看竖看不对劲,没看出来什么错误,

2018-08-10 17:34:48 +08:00
 wsds

使用场景: 以其中一个文件为基准(正确的值),对比两个文件中不同的行,并统计出来正确的数,错误的数 如

1.txt (基准文件)
a.jpg 0
b.jpg 2
c.jpg 3
...
2.txt
a.jpg 1
b.jpg 2
c.jpg 3
...

那么这两个文件中就 a.jpg 出错了 我的思路比较粗爆,就是拿 1 这个基准的每一行去了空格后,与 2 里边比,比中就记个数,一直把 1 中的挨个与 2 中的比一遍,但我发现这样写,每次 都要重新打开文件 2 一次,而且感觉不也靠谱,而且不知道怎么把错误的给挑出来,有什么更好的办法吗?或者是优化一下我这个

def compare(testfile, basefile):
    correct = 0
    all = 0
    with open(testfile, encoding="utf-8") as f1:
        for i in f1.readlines():
            all += 1
            with open(basefile, encoding="utf-8") as f2:
                for j in f2.readlines():
                    if i.replace(" ", "") == j.replace(" ", ""):
                        correct += 1
                    else:#想把错误的输出出来,但没有输出
                        print(i)#想把错误的输出出来
    print("样本数: %d\n 正确数: %d\n 错误数: %d\n 准确率: %f" %
          (all, correct, all - correct, correct / all))


if __name__ == '__main__':
    compare("test1.txt", "base1.txt")
5328 次点击
所在节点    Python
15 条回复
Yourshell
2018-08-10 17:41:19 +08:00
在循环里别用 with 呗,直接读文件读完关掉
ivechan
2018-08-10 17:47:22 +08:00
没必要非得用 with。
fffflyfish
2018-08-10 17:53:01 +08:00
读到 numpy 或者 pandas,然后直接比对列值,很简单呀
kethylar
2018-08-10 17:56:13 +08:00
return len(set(line.strip() for line in open(testfile)) - set(line.strip() for line in open(basefile)))
imn1
2018-08-10 17:57:06 +08:00
你实际上是同行数比较吧?
这样只需要一个 for 行数 就够了

你现在是两文件每行都交叉比较,数量级是相乘
luguhu
2018-08-10 17:58:42 +08:00
数据量不大可以直接 set 了,再取交集吧
wsds
2018-08-10 18:00:47 +08:00
@imn1 不是同行,是要交叉,可能 我举的例子看上去每一行都一样,其实不是这样的,是乱序的
wsds
2018-08-10 18:18:29 +08:00
@kethylar 这个太牛逼了,能不能把这个错误的值也显示出来啊
wsds
2018-08-10 18:25:09 +08:00
@kethylar 知道了,把 len 去掉就显示了,多谢
elsove812
2018-08-10 19:26:02 +08:00
分别打开前一个个文件,用前面的“ a.jpg ”、“ b.jpg ”....当作 key 后面的当作值存入字典,再打开第二个文件,逐行读入,用前一段去字典里取值,与后面的对比。
kethylar
2018-08-10 19:28:46 +08:00
@wsds 小文件可以这样搞,大点的文件借助一下 redis 啥的(或者直接比较 hash 值)
wsds
2018-08-10 20:47:14 +08:00
@kethylar 小文件指的是多小?
kethylar
2018-08-10 21:16:16 +08:00
@wsds 内存不爆我觉得都小。。。
wsds
2018-08-10 21:30:39 +08:00
@kethylar 那应该没啥压力,哈哈
thedrwu
2018-08-10 21:53:04 +08:00
sort | comm -3 | wc -l

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/478684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX