温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Why File.write() can't handling the tuple
file python python-3.7.4

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

发布于 2020-04-09 12:09:32

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

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

例如: 如果我传递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

我的结果是:

当运行写字节模式 时当运行追加字节模式时必需的结果运行写字节模式时 当运行附加字节模式时 所需结果

我仍然搜索无处不在,但仍找不到发生错误的答案。

查看更多

提问者
Keerthi Naathan H
被浏览
131
Tommaso Fontana 2020-02-03 04:47

简化代码

如果我们定义一个辅助函数,该函数周期性地返回元组中的数据:

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))