为什么 File.write() 无法处理元组

Why File.write() can't handling the tuple

我正在开发自定义文件粉碎机。

我想在文件中写入元组值字节。

例如: 如果我传递 3 个变量 (0,100,1) # 'b'00, 'b'd, 'b'01 文件大小为 200 字节。 对于 200/3 = 66 次,它将写入所有元组数据。在最后一轮 200%3 = 2 所以它将写入前 2 个元组数据。 当我试图实现它时,它出错了。

当我使用写字节模式时:

def multiple_writer(self, val:tuple):
    with open(self.file_path, 'wb+') as file:
        file_current = 0
        main_mode = True
        while file_current < self.file_size:
            if main_mode:
                for values in val:
                    if file_current <= self.file_size:
                        file.write(values)
                        file_current += 1
                    else:
                        main_mode = False
                        break
            else:
                break

当我使用附加字节模式时:

def multiple_writer(self, val:tuple):
    with open(self.file_path, 'ab+') as file:
        file_current = 0
        main_mode = True
        file.seek(0)
        while file_current < self.file_size:
            if main_mode:
                for values in val:
                    if file_current <= self.file_size:
                        file.write(values)
                        file_current += 1
                    else:
                        main_mode = False
                        break
            else:
                break

我的结果是:

当运行写字节模式 当运行追加字节模式时 要求的结果

我到处搜索,仍然找不到错误发生的地方的答案。

代码的简化

如果我们定义一个辅助函数,returns 循环元组中的数据:

def cyclic_iter(values):
    while True:
        for v in values:
            yield v

那么代码可以简单地变成:

def multiple_writer(self, val:tuple):
    with open(self.file_path, 'wb+') as file:
        generator = cyclic_iter(val)
        for _ in range(self.file_size):
            file.write(next(generator))

或者可以利用 zip 函数:

def multiple_writer(self, val:tuple):
    with open(self.file_path, 'wb+') as file:
        for _, value in zip(range(self.file_size), cyclic_iter(val)):
            file.write(value)

编辑:最简单的方法

既然你提到你刚刚开始 python 我会添加我知道的最简单的方法。

def multiple_writer(self, val:tuple):
    with open(self.file_path, 'wb+') as file:
        for i in range(self.file_size):
            file.write(val[i % len(val))