Проверка на совпадения в текстовом файле перед записью на Python - PullRequest
0 голосов
/ 23 июля 2011

Я работаю с очень большим текстовым файлом (500 МБ +), и код, который я имею, выводится отлично, но я получаю много дубликатов.То, что я хочу сделать, это проверить выходной файл, чтобы увидеть, существует ли вывод, прежде чем он записывает в файл.Я уверен, что это только одна строка в операторе if, но я плохо знаю Python и не могу понять синтаксис.Любая помощь будет принята с благодарностью.

Вот код:

authorList = ['Shakes.','Scott']

with open('/Users/Adam/Desktop/Poetrylist.txt','w') as output_file:
    with open('/Users/Adam/Desktop/2e.txt','r') as open_file:
            the_whole_file = open_file.read()
            for x in authorList:
                start_position = 0 
                while True:
                   start_position = the_whole_file.find('<A>'+x+'</A>', start_position)
                   if start_position < 0:
                       break
                   end_position = the_whole_file.find('</W>', start_position)
                   output_file.write(the_whole_file[start_position:end_position+4])
                   output_file.write("\n")    
                   start_position = end_position + 4

Ответы [ 4 ]

1 голос
/ 23 июля 2011

Я предлагаю вам просто отслеживать, какие авторские данные вы уже видели, и записывать их, только если вы не видели их раньше.Вы можете использовать dict для отслеживания.

authorList = ['Shakes.','Scott']
already_seen = {} # dict to keep track of what has been seen

with open('/Users/Adam/Desktop/Poetrylist.txt','w') as output_file:
    with open('/Users/Adam/Desktop/2e.txt','r') as open_file:
            the_whole_file = open_file.read()
            for x in authorList:
                start_position = 0 
                while True:
                   start_position = the_whole_file.find('<A>'+x+'</A>', start_position)
                   if start_position < 0:
                       break
                   end_position = the_whole_file.find('</W>', start_position)
                   author_data = the_whole_file[start_position:end_position+4]
                   if author_data not in already_seen:
                       output_file.write(author_data + "\n")
                       already_seen[author_data] = True
                   start_position = end_position + 4
0 голосов
/ 23 июля 2011

Я думаю, вам следует обработать ваш файл соответствующим инструментом для обработки текста: регулярные выражения.

import re

regx = re.compile('<A>(.+?)</A>.*?<W>.*?</W>')

with open('/Users/Desktop/2e.txt','rb')         as open_file,\
     open('/Users/Desktop/Poetrylist.txt','wb') as output_file:

    remain = ''
    seen = set()

    while True:
        chunk = open_file.read(65536) # 65536 == 16 x 16 x 16 x 16
        if not chunk:  break
        for mat in regx.finditer(remain + chunk):
            if mat.group(1) not in seen:
                output_file.write( mat.group() + '\n' )
                seen.add(mat.group(1))
        remain = chunk[mat.end(0)-len(remain):]
0 голосов
/ 23 июля 2011

Насколько я понимаю, вы хотите пропустить строки в open_file, который содержит имена ваших авторов, когда вы хотите написать в output_file.Если это то, что вы намереваетесь сделать, то делайте это следующим образом.

authorList = ['Shakes.','Scott']

with open('/Users/Adam/Desktop/Poetrylist.txt','w') as output_file:
    with open('/Users/Adam/Desktop/2e.txt','r') as open_file:
         for line in open_file:
              skip = 0
              for author in authorList:
                   if author in line:
                       skip = 1
              if not skip:
                   output_file.write(line)
0 голосов
/ 23 июля 2011

Создать список, содержащий каждую строку для записи.Если вы добавляете его, сначала проверьте, присутствует ли добавляемый элемент в списке или нет.

...