如何在 Python 中使用 BufferedWriter?

How to use a BufferedWriter in Python?

提问人:philgiese 提问时间:1/10/2012 更新时间:4/9/2020 访问量:13151

问:

我面临以下问题:我正在尝试为供应链实现模拟器。这些将产生大量 EPCIS 事件(发生在 RFID 读取器上的事件)。然后,应将这些事件写入 csv 文件,以便将它们加载到任何数据库中并对其运行分析算法。

模拟器是使用 python 实现的,工作正常。我现在尝试做的是缓冲地将事件写入文件,以减少访问磁盘所需的时间。浏览 python 文档时,我偶然发现了 io。BufferedWriter,这听起来和我一直在找的东西一模一样。无论如何,我不能完全让它工作。

这是我到目前为止所做的。我实现了我的类,该类继承自 RawIOBase 并管理文件句柄。当它被实例化时,它将创建一个 ,作为参数(这已经是一个问题了吗?CsvWriterBufferedWriterraw

class CsvWriter(AbstractWriter):

    def __init__(self, filename):    
        self.filename = filename
        self.file = self.openFile()
        self.buffer = BufferedWriter(self, settings.WRITE_THRESHOLD)

当我知道要写一些我称之为缓冲的东西时,它看起来像这样:write_buffered

def write_buffered(self, data_dict):    
        self.buffer.write(b';'.join(map(str, data_dict.values())) + '\n')

(正如我所想的)需要在类本身上实现的实际方法如下所示:writeCsvWriter

def write(self, data):
        if self.file.closed:
            self.file = self.openFile()

        return self.file.write(data)

问题是,当我尝试运行模拟器时,出现以下错误:

IOError: raw write() returned invalid length -1 (should have been between 0 and 78)

你们中有人对我有什么线索可以解决这个问题吗?

python 文件 缓冲 区 bufferedwriter

评论

1赞 1/10/2012
通常文件 I/O(例如)应该已经缓冲了(给了我一个实例),底层 C 库可能有一个缓冲区,操作系统可能有一个缓冲区,磁盘可能有一个缓存。你真的需要自己添加什么吗?openopen(...)Buffered{Reader,Writer}
0赞 philgiese 1/11/2012
好的,但是在写入磁盘之前,这会使用尽可能多的RAM吗?这基本上就是我想要实现的目标。在我写出之前尽可能多地保留内存。
2赞 Ricardo Cárdenes 1/11/2012
您可以在访问文件时为文件指定所需的缓冲区大小(第三个参数)。如果您只有基本需求,则无需创建自己的缓冲。注意:如果未指定大小,它将使用系统的默认值。在这里,一些文档。open

答: 暂无答案