从 .txt 文件读取扩展列表并在找到元素时中断循环。当第一个脚本完成时还要输入“done”

问题描述 投票:0回答:2

我正在编写一个Python代码,其中一个Python脚本打印所有的RGB值,而另一个Python脚本不断地读取它。 注意:它们都在单独的 python 文件中! 当第一个脚本完成打印所有 rgb 值时,我不知道如何在打印完所有值后打印完成。然后我正在处理下一个脚本,读取文件,即使我将完成放入txt文件中,我也无法让它停止。请帮助我。

第一个文件(类型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

这只是有 23 个值并在代码中完成的 color.txt 的示例。

python rgb
2个回答
0
投票

这里有很多东西需要解开。我将根据您提供的代码将这个答案分为两部分。我假设你是 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()

请特别注意以下变化:

  • 在开始时打开文件一次,在结束时关闭一次 - 这样,您就不会多次进行昂贵的 IO 操作
  • “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()

我觉得你不太清楚这里打开和关闭文件的概念,我建议进一步研究。


0
投票

我不确定我是否理解了你的所有问题,但这里有一个在找到“done”字符串时停止循环的解决方案:

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
© www.soinside.com 2019 - 2024. All rights reserved.