سؤال

لقد كنت أستخدم بيثون Difflib مكتبة لإيجاد أين تختلف وثائقان. طريقة الاختلاف (). قارن () تفعل هذا ، لكنها كذلك جداً بطيء - على الأقل 100x أبطأ لمستندات HTML الكبيرة مقارنة مع فرق أمر.

كيف يمكنني تحديد مكان وجود مستندتين في بيثون بكفاءة؟ (من الناحية المثالية ، أنا بعد المواضع بدلاً من النص الفعلي ، وهو ما يعود SequencEmatcher (). get_opcodes ().)

هل كانت مفيدة؟

المحلول

a = open("file1.txt").readlines()
b = open("file2.txt").readlines()
count = 0
pos = 0

while 1:
    count += 1
    try:
        al = a.pop(0)
        bl = b.pop(0)
        if al != bl:
            print "files differ on line %d, byte %d" % (count,pos)
        pos += len(al)
    except IndexError:
        break

نصائح أخرى

جوجل لديها مكتبة فرق للنص العادي مع API Python ، والتي يجب أن تنطبق على مستندات HTML التي تريد العمل معها. لست متأكدًا مما إذا كان هذا مناسبًا لحالة الاستخدام الخاصة بك حيث تهتم بشكل خاص بموقع الاختلافات ، لكن الأمر يستحق إلقاء نظرة عليه.

حل قبيح وغبي: إذا diff أسرع ، استخدمه ؛ من خلال مكالمة من بيثون عبر subprocess, ، تحليل إخراج الأمر للمعلومات التي تحتاجها. لن يكون هذا بالسرعة التي لا تقدر بها diff, ، ولكن ربما أسرع من difflib.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top