سؤال

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

عندما أحاول شيئا مثل:

result = difflib.SequenceMatcher(None, testFile, comparisonFile)

أحصل على خطأ يقول كائن من النوع "الملف" لا يوجد لديه لين.

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

المحلول

بالنسبة للمبتدئين، تحتاج إلى تمرير السلاسل إلى Difflib.WeelExematcher، وليس الملفات:

# Like so
difflib.SequenceMatcher(None, str1, str2)

# Or just read the files in
difflib.SequenceMatcher(None, file1.read(), file2.read())

التي سوف إصلاح الخطأ الخاص بك على أي حال. للحصول على أول سلسلة غير مطابقة، سأوجهك إلى عالم رائع وثائق difflib.

نصائح أخرى

فيما يلي مثال سريع لمقارنة محتويات ملفين باستخدام Python Diffflib ...

import difflib

file1 = "myFile1.txt"
file2 = "myFile2.txt"

diff = difflib.ndiff(open(file1).readlines(),open(file2).readlines())
print ''.join(diff),

هل أنت متأكد من كلا الملفين موجودين؟

فقط اختبرها وأحصل على نتيجة مثالية.

للحصول على النتائج التي أستخدمها شيئا مثل:

import difflib

diff=difflib.ndiff(open(testFile).readlines(), open(comparisonFile).readlines())

try:
    while 1:
        print diff.next(),
except:
    pass

يشير الطابع الأول لكل سطر إلى ما إذا كانت مختلفة: على سبيل المثال: "+" يعني أن السطر التالي تمت إضافته، إلخ.

يبدو أنك قد لا تحتاج إلى difflib على الإطلاق. إذا كنت تقارن الخط عبر السطر، فجرب شيئا مثل هذا:

test_lines = open("test.txt").readlines()
correct_lines = open("correct.txt").readlines()

for test, correct in zip(test_lines, correct_lines):
    if test != correct:
        print "Oh no! Expected %r; got %r." % (correct, test)
        break
else:
    len_diff = len(test_lines) - len(correct_lines)
    if len_diff > 0:
        print "Test file had too much data."
    elif len_diff < 0:
        print "Test file had too little data."
    else:
        print "Everything was correct!"

طريقة أسهل أخرى للتحقق مما إذا كانت ملفان نصي نفس الخط عبر السطر. حاول.

fname1 = 'text1.txt'
fname2 = 'text2.txt'

f1 = open(fname1)
f2 = open(fname2)

lines1 = f1.readlines()
lines2 = f2.readlines()
i = 0
f1.seek(0)
f2.seek(0)
for line1 in f1:
    if lines1[i] != lines2[i]:
        print(lines1[i])
        exit(0)
    i = i+1

print("both are equal")

f1.close()
f2.close()

خلاف ذلك، هناك ملف محدد مسبقا في Python في FileCMP الذي يمكنك استخدامه.

import filecmp

fname1 = 'text1.txt'
fname2 = 'text2.txt'

print(filecmp.cmp(fname1, fname2))

:)

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