Python: проверьте, существует ли переменная в файле .txt

#python #python-3.x #python-requests

#python #python-3.x #python-запросы

Вопрос:

у меня в папке 3 файла. (pythonapp.py , numbers.txt , usednumbers.txt ). Итак, в основном мое приложение извлекает случайную строку из (numbers.txt ) и сохраняет ее в переменной. Затем он записывает переменную в (usednumbers.txt ). Но проблема в том, что я не хочу записывать повторяющиеся строки в (usednumbers.txt ). Поэтому я бы хотел, чтобы мое приложение проверяло всякий раз, когда оно получает новую случайную строку из (numbers.txt ), что, если она уже использовалась в прошлом (так что, если она существует в usednumbers.txt )

 #imports-------------------------------
import random

#variables-----------------------------
line = random.choice(open('numbers.txt').readlines()) #get a random string
textfile = open("usednumbers.txt", "a") #open usednumbers txt file

#main----------------------------------
#here: need to check if our selected random variable "line"
#is in txt file "usednumbers.txt", if it exists there, we get a new random number
#if it doesn't exist there, we continue and write the variable there (below)

textfile.write(line) #store the number we are going to use
textfile.close() #so in future we avoid using this number again
  

Ответ №1:

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

Таким образом, вы можете прочитать файл number и отфильтровать число, которого нет в usednumber, и выбрать из него случайное число.

 #imports-------------------------------
import random

#variables-----------------------------
numbers = open('numbers.txt').read().splitlines() #get a random string

# alreday in usednumbes 
already_in_file = set([x for x in open("usednumbers.txt", "r").read().splitlines()])

# filtering only those number swhich are not in number.txt
numbers = [x for x in numbers if x not in already_in_file]

#choose random number
if len(numbers) >0 :  
  line = random.choice(numbers)

  #main----------------------------------
  textfile = open("usednumbers.txt", "a") #open usednumbers txt file
  textfile.writelines(str(line) "n") #store the number we are going to use
  textfile.close() #so in future we avoid using this number again
  

Ответ №2:

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

 #imports-------------------------------
import random

#variables-----------------------------
line = random.choice(open('numbers.txt').readlines()) #get a random string
textfile = open("usednumbers.txt", "a") #open usednumbers txt file

#main----------------------------------
#here: need to check if our selected random variable "line"
#is in txt file "usednumbers.txt", if it exists there, we get a new random number
#if it doesn't exist there, we continue and write the variable there (below)
while(line in open('usednumbers.txt').readlines()):
    line = random.choice(open('numbers.txt').readlines()) #get a random string

textfile.write(line) #store the number we are going to use
textfile.close() #so in future we avoid using this number again
  

Обновить:

Не самое эффективное по времени решение.

Смотрите решение, предоставленное @Suryaveer Singh для более оптимизированного решения.

Комментарии:

1. Решение работает, но предположим, что у нас есть число в несколько тысяч number.txt , тогда цикл while будет выполняться вечно, поскольку операция чтения-записи является дорогостоящей. Сложность решения превышает O (n ^ 2), поэтому, если у вас в файле 1 миллион чисел, на проверку уйдут годы.

2. @SuryaveerSingh Кроме того, не только операции чтения-записи являются дорогостоящими, но и решение основано на чистой случайности. Итак, если оба файла содержат миллион записей, а в numbers.txt ошибка в usednumbers.txt может потребоваться буквально вечность, чтобы одна из этих записей была выбрана случайным образом среди миллионов других.

3. точно, я пытался передать только это. Спасибо за понимание 🙂 Я опубликовал свой ответ, вы можете проверить это

4. @SuryaveerSingh Я сделал, я поддержал это. Спасибо, что указали на это. 🙂