PYTHON как искать в текстовом файле номер - PullRequest
0 голосов
/ 04 августа 2011

Есть текстовый файл, который я читаю построчно.Это выглядит примерно так:

3

3

67

46

67

3

46

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

Ответы [ 5 ]

5 голосов
/ 04 августа 2011

Вместо поиска в выходном файле сохраните набор чисел, которые вы написали, и пишите только те числа, которых нет в наборе.

1 голос
/ 04 августа 2011

Вместо проверки выходного файла на номер, если он уже записан, лучше сохранить эту информацию в переменной (a set или list).Это спасет вас от чтения с диска.

Для поиска в файле чисел, которые вам нужно перебрать в каждой строке этого файла, вы можете сделать это с помощью for line in open('input'): loop, где input - это имя вашегофайл.На каждой итерации line будет содержать одну строку входного файла, заканчивающуюся символом конца строки '\ n'.

На каждой итерации вы должны пытаться преобразовать значение в этой строке в число, int()функция может быть использована.Вы можете захотеть защитить себя от пустых строк или нечисловых значений с помощью оператора try.

В каждой итерации с номером, который вы должны проверить, не было ли найденное вами значение уже записано в выходной файлпроверка set уже написанных номеров.Если значение еще не задано, добавьте его и запишите в выходной файл.

#!/usr/bin/env python                                                           
numbers = set() # create a set for storing numbers that were already written       
out = open('output', 'w') # open 'output' file for writing                      
for line in open('input'): # loop through each line of 'input' file             
    try:                                                                        
        i = int(line) # try to convert line to integer                          
    except ValueError:  # if conversion to integer fails display a warning         
        print "Warning: cannot convert to number string '%s'" % line.strip()       
        continue # skip to next line on error                                   
    if i not in numbers: # check if the number wasn't already added to the set  
        out.write('%d\n' % i) # write the number to the 'output' file followed by EOL
        numbers.add(i) # add number to the set to mark it as already added

В этом примере предполагается, что файл input содержит отдельные числа в каждой строке.В случае пустого в неправильной строке предупреждение будет отображаться на stdout.

Вы также можете использовать list в приведенном выше примере, но это может быть менее эффективно.Вместо numbers = set() используйте numbers = [] и вместо numbers.add(i): numbers.append(i).Условие if остается прежним.

0 голосов
/ 04 августа 2011

Если вы хотите просмотреть файл, чтобы увидеть, содержит ли он число в любой строке, вы можете сделать что-то вроде этого:

def file_contains(f, n):
    with f:
        for line in f:
            if int(line.strip()) == n:
                return True

        return False

Однако, как указывает Нед в своем ответе, это не очень эффективное решение; если вам придется искать файл снова для каждой строки, время выполнения вашей программы будет увеличиваться пропорционально квадрату числа чисел.

Если число значений невелико, было бы более эффективно использовать набор ( документация ). Наборы предназначены для очень эффективного отслеживания неупорядоченных значений. Например:

with open("input_file.txt", "rt") as in_file:
    with open("output_file.txt", "wt") as out_file:
        encountered_numbers = set()
        for line in in_file:
            n = int(line.strip())

            if n not in encountered_numbers:
                encountered_numbers.add(n)
                out_file.write(line)
0 голосов
/ 04 августа 2011

Вы работаете с исключительно большими файлами? Вы, вероятно, не хотите пытаться «искать» файл, в который вы пишете, значение, которое вы только что написали. Вы (вероятно) хотите что-то еще как это:

encountered = set([])

with open('file1') as fhi, open('file2', 'w') as fho:
  for line in fhi:
    if line not in encountered:
      encountered.add(line)
      fho.write(line)
0 голосов
/ 04 августа 2011

Не делай этого.Используйте set(), чтобы отслеживать все числа, которые вы видели.У него будет только один из них.

numbers = set()
for line in open("numberfile"):
    numbers.add(int(line.strip()))
open("outputfile", "w").write("\n".join(str(n) for n in numbers))

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

numbers = set()
with open("outfile", "w") as outfile:
    for line in open("numberfile"):
        number = int(line.strip())
        if number not in numbers:
            outfile.write(str(number) + "\n")
            numbers.add(number)
...