V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yeyu1989
V2EX  ›  Python

如何比较两个大的文本文件内容的差异

  •  1
     
  •   yeyu1989 · 2019-12-11 10:37:18 +08:00 · 6277 次点击
    这是一个创建于 1590 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设 A、B 两个文件,按行比,显示 A 比 B 多的行、B 比 A 多的行、A 与 B 都存在但是不一致的行。 类似于实现 Beyond Compare 的功能。

    12 条回复    2019-12-12 13:38:13 +08:00
    TimePPT
        1
    TimePPT  
       2019-12-11 10:40:02 +08:00
    既然是 python 节点的话,试试 python 标准库 difflib ?
    https://docs.python.org/zh-cn/3.7/library/difflib.html
    Vegetable
        2
    Vegetable  
       2019-12-11 10:46:04 +08:00
    这也太笼统了,你这个需求也许 git diff 就能满足,"A 与 B 都存在但是不一致的行"是说位置不同吗?
    简单来说,因为你的最小对比单位是行,所以你可以直接计算单行的 md5,为两个文件建立{hash:line_no}的字典,进行后续处理.
    haozxuan001
        3
    haozxuan001  
       2019-12-11 10:46:15 +08:00
    linux 有一个 comm 可以了解一下,不同的参数可以对比出不同的差异,比如 A 有 B 无,A 无 B 有,当然需要注意一句这两个大文件需要先排序一下
    leafin
        4
    leafin  
       2019-12-11 10:47:34 +08:00   ❤️ 1
    “A 与 B 都存在但是不一致的行”这一句话怎么定义?
    SoulMelody
        5
    SoulMelody  
       2019-12-11 10:51:34 +08:00
    yeyu1989
        6
    yeyu1989  
    OP
       2019-12-11 11:00:04 +08:00
    追加问题描述:
    大文件有多大:可达 G 级别
    文件格式:多为每行定长的 txt 文件,按列定义不同的字段。之前有考虑过,先将 txt 转为 csv 文件,定义主键,再比对,但是这样对存储、内存消耗都特别大,并且有的文件定义主键后建不了索引,也无法完成比对

    Beyond Compare 在定义 A 有 B 无、A 无 B 有、AB 不一致时,貌似是按照相似度来处理的?这个第一没有主键说明,确实不好定义。

    以上。
    @Vegetable @haozxuan001 @leafin
    @TimePPT 多谢,我去学习下,看看行不行
    gwy15
        7
    gwy15  
       2019-12-11 11:02:10 +08:00
    看看 Myers 算法
    haozxuan001
        8
    haozxuan001  
       2019-12-11 11:07:08 +08:00
    @yeyu1989 我之前做过 M 级别的,个人认为如果达到 G 的级别,一定是先排序后对比,这样才能不爆内存的情况下,“一块块”的对比出来,另外你的 AB 不一致相似度这种就玄学了,一样就是一样,不一样错一个字符都不一样,如果这是一个强需求,可能我上述的方案就合适了,如果是弱需求,可以先找出两个文件的差异行。
    richzhu
        9
    richzhu  
       2019-12-11 11:09:09 +08:00
    vimdiff fileA fileB
    614457662
        10
    614457662  
       2019-12-11 12:13:21 +08:00 via Android
    先 sort 再 diff
    hxse
        11
    hxse  
       2019-12-12 13:28:38 +08:00
    @yeyu1989 标准库 difflib 能解决你的需求吗
    yeyu1989
        12
    yeyu1989  
    OP
       2019-12-12 13:38:13 +08:00
    @hxse 还没有试 ///直觉不行,效率可能跟不上
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   996 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:43 · PVG 03:43 · LAX 12:43 · JFK 15:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.