При сравнении списков вы можете пропустить индекс, который был сделан в предыдущей итерации? - PullRequest
0 голосов
/ 30 января 2019

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

Я пытаюсь перебрать весь меньший список по сравнению с каждой записью в большем списке, пока он не совпадет, скопировать строку в новый файл, если есть совпадение, и записать пустую строку в новомфайл, если еще нет.Проблема в том, что на каждой итерации она начинается с начала. Я хочу, чтобы она пропускала строки, уже проверенные на предыдущей итерации.Есть ли способ сделать это или было бы лучше удалить строки из файла, как происходит?

#opening of files
fh = open('sampleparsefile.txt', "r")
fh2 = open('sampleparsefile2.txt', "r")
f = open('compared', 'w')
#fhw = open('sampleparsefile.txt', "w")



# Make each line a list split at open '('
line1Split = [line1.split('(')[0] for line1 in fh.readlines()]
line2Split = [line2.split('(')[0] for line2 in fh2.readlines()]
print(line1Split)
print(line2Split)


# iterate through line2Split
# for item2 in line2Split:
for item2 in line2Split:
    #splitSingleLine = [aVariable.split('(')[0]]


    # Set a variable to false
    founditem = False
    # iterate through each entry in line1Split comparing
    # to item in line2Split
    for item1 in line1Split:
        # While match is not found
        # boolean variable set to false
        while (founditem == False):
            # if they match write the match to a file and break
            # change boolean variable to true if matched
            if item1 == item2:
                founditem = True
                # if there is a newline character strip it
                # if there isn't continue on
                if '\n' in str(item2):
                    x = item2.split('\n')[0]
                    f.write(str(x))
                    break
                else:
                    f.write(item2)
                    # WAS HERE but thinking deleting lines from original file would not be good idea
                    #fhw = open('sampleparsefile.txt', "w")
                    #for aLines in fhw.readlines:
                    #    if item1 != item2:
                    #        line1Split.pop[0]
                    break
                    # also will want to remove found entry from line2split
                    # that way following passes wont search same first lines
                    # will also need to re-attach what was in parenthesis
                    # before writing to file
                    # if match is not found write a new line to file and break
            else:
                    f.write('\n')
                    break
fh.close()
fh2.close()
f.close()

#Sampleparsefile.txt sample ignore all #
# Data1
# Data2
# Data3(a)
# Data4(ab)
# Data5(ABC)
# Data6
# Data7
# Data8(a)
# Data9(a)

#Sampleparsefile.txt sample
# Data1
# Data3(a)
# Data5(ABC)
# Data6
# Data8(A)
# Data9(a)

#Desired Result - for now just whats before brackets
# Data1
#
# Data3(ABC)
# 
# Data5(A)
# Data6
# 
# Data8(a)
# Data9(a)

#Actual Result
# Data1
#
# Data3
#
#
#
# Data5
# 
#
#
#
# Data6
#
#
#
#
#
#
# Data8
#
#
#
#
#
#
#
# Data9

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Если во вложенном цикле используется line1Split в качестве первого индекса, коды могут получить правильные пустые строки.

fh = open('sampleparsefile.txt', "r")
fh2 = open('sampleparsefile2.txt', "r")
f = open('compared.txt', 'w')

#Use strip() to strip '\n' end of each line and you will not need to manage it later
line1Split = [line1.split('(')[0].strip('\n') for line1 in fh.readlines()]
line2Split = [line2.split('(')[0].strip('\n') for line2 in fh2.readlines()]

for item1 in line1Split:
    found = False
    for item2 in line2Split:
        if item1 == item2:
            f.write(str(item2))
            f.write('\n')
            found = True
            break
    if not found:
        f.write('\n')
fh.close()
fh2.close()
f.close()
0 голосов
/ 30 января 2019

Вместо использования второго цикла for используйте цикл while, основанный на инкрементной переменной.Например:

i = 0
for item2 in list2:

    founditem = False
    while i < len(list1):

        # your code that goes inside the second for loop

        i += 1

Надеюсь, это поможет вам.

...