在嵌套循环中使用文件(打开,写入,关闭)

时间:2019-07-09 12:12:35

标签: python

我想生成两位数的计数器,并将其写入文件中,并为每个实例做一些事情。每个数字实际上是一个十六进制值表示的字节。所以,我想

0-打开要写入的文件

1-生成0x00,0x00

2-将其写入文件中。

3-关闭文件并进行处理

,对于0x00,0x010x00,0x02以及...和0x01,0x00一直持续到0xff,0xff

我写了这样的样本

for i in range(2):
    f = open("file.txt", "w")
    f.write("0x{:02x},".format(i))
    for j in range(3):
        f.write("0x{:02x}".format(j))
        f.close()
        # run a cmd and pass this file as an argument

最终脚本中的范围应为256。但是,问题在于,当在内部循环中关闭文件时,无法为下一个内部迭代中的第二个数字做好准备。因此,该代码仅适用于i = j = 0,并且当i = 0,j = 1时无法将十六进制值写入文件。

我该如何解决?

3 个答案:

答案 0 :(得分:1)

问题在于,在第一个j循环结束时,您关闭了文件,但不再再次打开它。您应该在同一循环中打开和关闭它:

for i in range(2):
    for j in range(3):
        f = open("file.txt", "w+")
        f.write("0x{:02x},".format(i))
        f.write("0x{:02x}".format(j))
        f.close()
        # run a cmd and pass this file as an argument

答案 1 :(得分:0)

不必担心在下一次迭代之前就不会写入文件,因为那里有缓冲区可确保您不会丢失任何内容。当您写入文件时,即使是在简单的循环中,关闭文件时也会按顺序写入所有内容。关闭并打开文件以确保所有内容都被写入,首先效率非常低,其次是不必要的。

您可以简单地遵循以下原则:

with open("file.txt", "w+") as f:
    for i in range(2):
        f.write("0x{:02x},".format(i))
        for j in range(3):
            f.write("0x{:02x}".format(j))

如果您仍然坚持要强制执行io操作,则可以使用file.flush()

== EDIT ==

我有点误解了您在这里所说的内容,但是我仍然认为打开和关闭并不是路要走。相反,我建议将字符串作为所述脚本的参数传递。但是,如果您坚持使用该文件,则可能会这样:

with open("file.txt", "w") as f:
    for i in range(2):
        f.seek(0)
        f.write("0x{:02x},".format(i))
        for j in range(3):
            f.write("0x{:02x}".format(j))
            f.flush()
            #do your cmd, I hope it opens the file in read mode.

几分钟后我放弃了计时:

>>> timeit.timeit('for i in range(3): f = open("file.txt", "w"); f.write("test"); f.close()')

但这很快就完成了:

>>> timeit.timeit('for i in range(3): f.seek(0); f.write("test"); f.flush()', setup = 'f = open("file.txt", "w")')

23.751912800013088

答案 2 :(得分:0)

除了嵌套两个循环,您还可以使用itertools.product()来生成值:

#!/usr/bin/env python3
from itertools import product


def main():
    for i, j in product(range(256), repeat=2):
        with open('test.txt', 'w') as file:
            file.write(f'0x{i:02x},0x{j:02x}\n')
        # run a cmd and pass this file as an argument


if __name__ == '__main__':
    main()