Я создаю код 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 значения.
Как мне сделать глобальную работу?
В read
нельзя, так как это параметр.
Так следует ли мне заменить слово «сделано» на слово «нет», когда оно не сделано, и «да», когда оно сделано?
Спасибо. Причина, по которой я это сделал, заключалась в том, что мне было скучно. Но я приму это во внимание
Посмотрите мой окончательный ответ. Я рассмотрел все, что мог придумать, относительно проблем с вашей попыткой.
Здесь есть что раскрыть. Я разделю этот ответ на два раздела на основе предоставленных вами кодов. Я предполагаю, что вы новичок в Python, и я постараюсь структурировать свой ответ как таковой.
Если вы улучшите свой код, не меняя его сильно, он может выглядеть так:
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()
Обратите особое внимание на следующие изменения:
Более сложные советы, если вы захотите изучить их позже:
with
для открытия файла, чтобы избежать необходимости его закрытия.Вы слишком усложняете эту часть. Если ваша цель — прочитать список и распечатать значения одно за другим, вы можете добиться этого с помощью чего-то простого:
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()
Я чувствую, что вы не совсем уверены в концепции открытия и закрытия файлов, и я бы посоветовал продолжить изучение этого вопроса.
Большое спасибо. Я также обязательно закрою больше файлов.
Я не уверен, что понял весь ваш вопрос, но вот решение для остановки цикла, когда он находит строку «готово»:
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)
done
вread
является локальным для этой функции, поэтому его изменение не влияет на глобальныйdone
.