Как проверить, включены ли строки в двух файлах друг в друга

python

188 просмотра

3 ответа

Я новичок в Python, есть проблема со сравнением двух файлов и получить вывод в логической форме. Я видел несколько рекомендаций здесь, но из-за меньшего количества знаний приложений я не мог успокоиться. Эти два текстовых файла, связанных с разрешениями, необходимо сравнить

1-й текстовый файл: perm.txt

ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ACCESS_NETWORK_STATE
BLUETOOTH
CAMERA
CHANGE_WIFI_STATE
EXPAND_STATUS_BAR
GET_ACCOUNTS
GET_TASKS
MANAGE_DOCUMENTS
READ_EXTERNAL_STORAGE
READ_LOGS
RECORD_AUDIO
SET_WALLPAPER
USE_CREDENTIALS
VIBRATE
WRITE_CALENDAR

Файл 2-го текстового файла: op3.txt

GET_TASKS
EXPAND_STATUS_BAR
SET_WALLPAPER
CAMERA
MANAGE_DOCUMENTS
READ_EXTERNAL_STORAGE
ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
CHANGE_WIFI_STATE
VIBRATE
RECORD_AUDIO

Мне нужно сравнить права доступа ко второму файлу с первым файлом и на основе сравнения, если разрешение в двух файлах одинаковое, вывод должен быть «1» или «True», если нет, то «0» или «False»

Я пробовал со следующими кодами

f1 = open('op2.txt', 'r')
f2 = open('permissions.txt', 'r')
FO = open('out1.txt', 'w')

for line1 in sorted(f2):
    if line1 is f1:
        FO.write(line1 + "True" + '\n')
    else:
        FO.write(line1 + "False" + '\n')

FO.close()
f1.close()
f2.close()

другая попытка, которую я попытался сделать так, изначально позволила получить выходные данные для двух или трех разрешений, которые я пробовал разными способами, но не смог получить их, наконец, я ударил здесь, в этот момент

fname1 = input("Enter the first filename: ")
fname2 = input("Enter the second filename: ")


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


print("-----------------------------------")
print("Comparing files ", " > " + fname1, " < " + fname2, sep='\n')
print("-----------------------------------")


f1_line = f1.readline()
f2_line = f2.readline()

line_no = 1

# Loop if either file1 or file2 has not reached EOF
while f1_line != '' or f2_line != '':


f1_line = f1_line.rstrip()
f2_line = f2_line.rstrip()


if f1_line != f2_line:

    # If a line does not exist on file2 then mark the output with false
    if f2_line == '' and f1_line != '':
        print("false", "Line-%d" % line_no, f1_line)
    # otherwise output the line on file1 and mark it with > sign
    elif f1_line != '':
        print("True", "Line-%d" % line_no, f1_line)



    # Print a blank line
    print()

# Read the next line from the file
f1_line = f1.readline()
f2_line = f2.readline()


line_no += 1


f1.close()
f2.close()
Автор: muppavaram kireet Источник Размещён: 08.11.2019 11:15

Ответы (3)


0 плюса

Решение

Один из способов сделать это ниже:

f1 = open('perm.txt', 'rb')
f2 = open('op3.txt', 'rb')
f1_lines = f1.readlines()
f2_lines = f2.readlines()
f1.close()
f2.close()
overall_compare_result = True
fo = open('out1.txt', 'w')
for each in f1_lines:
    if each in f2_lines:
        fo.write(each.strip() + ' True\n')
    else:
        fo.write(each.strip() + ' False\n')
        if overall_compare_result:
            overall_compare_result = False
fo.close()
print("overall comparision result: " + str(overall_compare_result))

out.txt будет иметь ниже:

ACCESS_COARSE_LOCATION True
ACCESS_FINE_LOCATION True
ACCESS_NETWORK_STATE False
BLUETOOTH False
CAMERA True
CHANGE_WIFI_STATE True
EXPAND_STATUS_BAR True
GET_ACCOUNTS False
GET_TASKS True
MANAGE_DOCUMENTS True
READ_EXTERNAL_STORAGE True
READ_LOGS False
RECORD_AUDIO False
SET_WALLPAPER True
USE_CREDENTIALS False
VIBRATE True
WRITE_CALENDAR False
Автор: be_good_do_good Размещён: 21.08.2016 07:38

1 плюс

Если вам нужно только быстрое и быстрое сравнение строк, почему бы вам не использовать хеширование (md5 / sha1)?

Сортируйте строки, затем используйте что-то вроде этого:

import md5

m1 = md5.md5(file1_str)
m2 = md5.md5(file2_str)

if m1.hexdigest() == m2.hexdigest():
    ....
else:
    ....
Автор: Protostome Размещён: 21.08.2016 06:18

1 плюс

Функция

get_line_set = lambda f_name: set([l.strip() for l in open(f_name, 'r')])

Создает setиз строк f_name.

Теперь вы можете просто использовать

get_line_set('perm.txt') == get_line_set('op3.txt')

Более того, наборы позволяют увидеть пересечение, разность, симметричную разность и т. Д. Например, чтобы увидеть разницу от perm.txtдо op3.txt, просто изменить это

get_line_set('perm.txt').difference(get_line_set('op3.txt'))
Автор: Ami Tavory Размещён: 21.08.2016 07:04
Вопросы из категории :
32x32