2017-02-18 1 views
0

Я пытаюсь извлечь 100 первых вхождений каждого элемента списка file_1.txt в новый файл. Перечень пунктов (так называемый целевой в коде ниже) состоит из первого столбца file_1.txtpython - extract N вхождения элементов в список файлов

file_1.txt

now:::ADV  1.48 be:::V 1.85 5488284 
then:::ADV  1.44 be:::V 1.85 3994804 
now:::ADV  1.48 have:::V  2.18 1760901 
then:::ADV  1.44 have:::V  2.18 1099284 
enough:::ADV 1.33 be:::V 1.85 928947 
suppose:::V  1.37 be:::V 1.85 874407 
ever:::ADV  1.48 be:::V 1.85 859428 

код, который я пытался здесь:

with open('file_1.txt', 'r') as infile, open('file_2.txt', 'w') as outfile: 
target = [] 
i = 1 
for line in infile: 
    columns = line.split("\t") 
    column_1 = columns[0] 
    if column_1 not in target: 
     target.append(column_1) 
    for item in target: 
     if line.startswith(item) and i <=100: 
      outfile.write(line) 
    i += 1 

Это, конечно, просто печатает 100 первых строк файла file_1.txt в file_2.txt. Есть ли питонический способ чтения только по одной строке за раз, добавив его к целевому и поискам 100 первых вхождений, напечатайте его в файл_2.txt и продолжите со следующим уникальным словом в столбце 1 файла file_1.txt?

Я очень благодарен за любую помощь или предложения.

+0

Вам нужен выход в порядке появления цели или в порядке 100-го появления в порядке? –

+0

@Paul Panzer заказ не имеет значения, как только он находится в 100-м месте –

ответ

1

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

with open('file_1.txt', 'r') as infile, open('file_2.txt', 'w') as outfile: 
    target = {} 

    for line in infile: 
     columns = line.split("\t") 
     column_1 = columns[0] 
     try: 
      target[column_1].append(line) 
      if len(target[column_1]) == 100: 
       for tline in target[column_1]: 
        outfile.write(tline) 
       target[column_1] = None # mark word as finished 
     except KeyError: # we haven't seen that word before -> start new list 
      target[column_1] = [line] 
     except AttributeError: # this is raised each time we try appending to None 
      pass 
+0

отлично, он точно производит выходные данные, которые мне нравятся, большое вам спасибо! Я очень ценю вашу помощь! Спасибо! –

+0

ваш код просто пропускает первое вхождение каждого слова, это то, что вы просили в своем предыдущем комментарии? Прошу прощения, если я его неправильно понял. Поэтому file_1.txt сортируется по частоте, и я хотел бы иметь первые 100 вхождений слова. Это простое решение или требуется много изменений? –

+0

@dani_anyman добро пожаловать! –

Смежные вопросы