Как я могу записать строки из первого текстового файла, которых нет во втором текстовом файле? - PullRequest
0 голосов
/ 02 апреля 2019

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

Я написал код, который, кажется, работает непоследовательно. Я не уверен, что я делаю неправильно.

newLines = open("file1.txt", "r")
originalLines = open("file2.txt", "r")
output = open("output.txt", "w")

lines1 = newLines.readlines()
lines2 = originalLines.readlines()
newLines.close()
originalLines.close()

duplicate = False
for line in lines1:
    if line.isspace():
        continue
    for line2 in lines2:
        if line == line2:
            duplicate = True
            break

    if duplicate == False:
        output.write(line)
    else:
        duplicate = False

output.close()

Для file1.txt:

Man
Dog
Axe
Cat
Potato
Farmer

file2.txt:

Man
Dog
Axe
Cat

Файл output.txt должен быть:

Potato
Farmer

но вместо этого это:

Cat
Potato
Farmer

Любая помощь будет высоко ценится!

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Исходя из поведения, file2.txt не заканчивается новой строкой, поэтому содержимое lines2 равно ['Man\n', 'Dog\n', 'Axe\n', 'Cat']. Обратите внимание на отсутствие новой строки для 'Cat'.

Я бы предложил нормализовать ваши строки, чтобы в них не было новых строк, заменив:

lines1 = newLines.readlines()
lines2 = originalLines.readlines()

с:

lines1 = [line.rstrip('\n') for line in newLines]
# Set comprehension makes lookup cheaper and dedupes
lines2 = {line.rstrip('\n') for line in originalLines}

и меняется:

output.write(line)

до:

print(line, file=output)

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

for line2 in lines2:
    if line == line2:
        duplicate = True
        break

if duplicate == False:
    output.write(line)
else:
    duplicate = False

просто:

if line not in lines2:
    print(line, file=output)

, который, если вы используете set для lines2, как я предлагаю, делает стоимость падения теста линейной по количеству строк в file2.txt до приблизительно постоянной независимо от размера file2.txt ( до тех пор, пока набор уникальных линий не умещается в памяти).

Еще лучше, используйте операторы with для ваших открытых файлов и передайте file1.txt вместо того, чтобы вообще хранить его в памяти, и вы получите:

with open("file2.txt") as origlines:
    lines2 = {line.rstrip('\n') for line in origlines}

with open("file1.txt") as newlines, open("output.txt", "w") as output:
    for line in newlines:
        line = line.rstrip('\n')
        if not line.isspace() and line not in lines2:
            print(line, file=output)
0 голосов
/ 02 апреля 2019

Вы можете использовать NumPy для меньшего и более быстрого решения. Здесь мы используем эти методы NumPy np.loadtxt Документы: https://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html np.setdiff1d Документы: https://docs.scipy.org/doc/numpy-1.14.5/reference/generated/numpy.setdiff1d.html np.savetxt Документы: https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html

import numpy as np


arr=np.setdiff1d(np.loadtxt('file1.txt',dtype=str),np.loadtxt('file2.txt',dtype=str))
np.savetxt('output.txt',b,fmt='%s')
...