Чтение расширяющегося списка из файла .txt и разрыв цикла при обнаружении элемента. Также ввод завершен после завершения первого скрипта

Я создаю код Python, в котором один скрипт Python печатает все значения RGB, а другой скрипт Python постоянно их читает. ПРИМЕЧАНИЕ. Оба они находятся в отдельных файлах Python! Когда первый скрипт завершает печать всех значений RGB, я не знаю, как распечатать его, когда он завершит печать всех значений. Затем я работаю над следующим скриптом, читаю файл, и не могу его остановить, хотя я и написал «Готово» в текстовом файле. Пожалуйста, помогите мне.

Первый файл (типы значений RGB)

def generatergbvalues():
    rgb_values = []
    for r in range(256):
        for g in range(256):
            for b in range(256):
                rgb_values.append((r, g, b))
    return rgb_values

def run():
    rgb_values = generatergbvalues()
    
    # Print the RGB values
    for value in rgb_values:
        file = open ('Python/Color/colors.txt', 'a+')
        file.write(str(value))
        file.write('\n')
        print(value)

if __name__ == "__main__":
    run()

Это печатает значения RGB, все работает хорошо, но мне нужно, чтобы печать выполнялась, когда все значения RGB достигнуты.

Второй файл (считывает значения RGB)

done = False
def read(done):
    file = open ('Python/Color/colors.txt', 'r')
    data = file.read()
    datalist = data.replace('\n', '/').split('/')
    print(datalist)
    i = "done"
    if i in datalist:
        done == True
while done == False:
    read(done)
    if done == True:
        break

Он хорошо читает файлcolors.txt, но мне не удается его остановить после того, как он увидел слово «готово». Это просто продолжается вечно.

Colors.txt(Файл, содержащий все значения RGB[Пример])

(0, 0, 0)
(0, 0, 1)
(0, 0, 2)
(0, 0, 3)
(0, 0, 4)
(0, 0, 5)
(0, 0, 6)
(0, 0, 7)
(0, 0, 8)
(0, 0, 9)
(0, 0, 10)
(0, 0, 11)
(0, 0, 12)
(0, 0, 13)
(0, 0, 14)
(0, 0, 15)
(0, 0, 16)
(0, 0, 17)
(0, 0, 18)
(0, 0, 19)
(0, 0, 20)
(0, 0, 21)
(0, 0, 22)
(0, 0, 23)
done

Это всего лишь образец файла flowers.txt, в котором в коде содержится 23 значения.

done в read является локальным для этой функции, поэтому его изменение не влияет на глобальный done.

Scott Hunter 26.08.2024 16:42

Как мне сделать глобальную работу?

aCoder71641289479121 26.08.2024 16:46

В read нельзя, так как это параметр.

Scott Hunter 26.08.2024 17:02

Так следует ли мне заменить слово «сделано» на слово «нет», когда оно не сделано, и «да», когда оно сделано?

aCoder71641289479121 26.08.2024 17:05

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

aCoder71641289479121 26.08.2024 19:24

Посмотрите мой окончательный ответ. Я рассмотрел все, что мог придумать, относительно проблем с вашей попыткой.

OysterShucker 26.08.2024 20:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Здесь есть что раскрыть. Я разделю этот ответ на два раздела на основе предоставленных вами кодов. Я предполагаю, что вы новичок в Python, и я постараюсь структурировать свой ответ как таковой.

Создание списка RGB

Если вы улучшите свой код, не меняя его сильно, он может выглядеть так:

def generatergbvalues():
    rgb_values = []
    for r in range(256):
        for g in range(256):
            for b in range(256):
                rgb_values.append((r, g, b))
    return rgb_values

def run():
    rgb_values = generatergbvalues()
    # Print the RGB values
    file = open("Python/Color/colors.txt", "w")
    for value in rgb_values:
        file.write(str(value))
        file.write('\n')
    file.write("done")
    file.close()

if __name__ == "__main__":
    run()

Обратите особое внимание на следующие изменения:

  • откройте файл один раз в начале, закройте его один раз в конце - таким образом, вы не выполняете дорогостоящие операции ввода-вывода много раз
  • «done» можно напечатать просто после цикла, который завершается, когда заканчиваются значения RGB.

Более сложные советы, если вы захотите изучить их позже:

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

Чтение списка RGB

Вы слишком усложняете эту часть. Если ваша цель — прочитать список и распечатать значения одно за другим, вы можете добиться этого с помощью чего-то простого:

def read():
    file = open('Python/Color/colors.txt', 'r')
    data = file.read()
    for rgb_item in data.split('\n'):
        # do something with the data here
        print(rgb_item)
    file.close()

if __name__ == '__main__':
    read()

Это прекратится после прочтения всего файла.

Ваш код не остановился, потому что done не была глобальной переменной, потому что у вас была опечатка в присваивании (== — сравнение, = — присваивание) и потому что каждый цикл читал весь файл.

В случае, если вы хотите прочитать файл построчно И останавливать его каждый раз, когда вы нажимаете строку «Готово», это будет выглядеть так:

def read():
    file = open('Python/Color/colors.txt', 'r')
    data = file.read()
    for rgb_item in data.split('\n'):
        # do something with the data here
        if rgb_item == "done":
            break
        print(rgb_item)
    file.close()

if __name__ == '__main__':
    read()

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

Большое спасибо. Я также обязательно закрою больше файлов.

aCoder71641289479121 26.08.2024 19:24

Я не уверен, что понял весь ваш вопрос, но вот решение для остановки цикла, когда он находит строку «готово»:

def find_done():
   file = open ('colors.txt', 'r')
   data = file.read()
   datalist = data.replace('\n', '/').split('/')
   print(datalist)
   i = "done"
   if i in datalist:
       return True

while True:
   if find_done():
       break

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

# generator for RGB values
def rgbvalues():
    for c in range(0x1000000):
        # use shifting and masking to parse channels
        yield (c >> 16) & 0xFF, (c >> 8) & 0xFF, c & 0xFF

if __name__ == "__main__":
    with open('Python/Color/colors.txt','a+') as file:
        # write each color as it is generated
        for values in rgbvalues():
            # write value as CSV
            file.write(f'{",".join(values)}\n')
            
        # colors have completed, write "done"
        file.write("done")
def read():
    with open('Python/Color/colors.txt','r') as file:
        # store each line, except "done", and determine if done
        datalist, done = [], False
        for line in file:
            if not (done := line.startswith("done")):
                # parse data back to tuples of int and append
                datalist.append(tuple(map(int, line.strip().split(","))))
    
    # return data based on the state of done   
    return datalist if done else None

# keep reading the file until `read` is not None        
while not (datalist := read()):
    # do nothing
    ...
    
print(datalist)

Другие вопросы по теме