Как использовать BufferedWriter в Python? - PullRequest
6 голосов
/ 10 января 2012

У меня возникла следующая проблема: я пытаюсь реализовать симулятор для цепочек поставок. Это приведет к большому количеству событий EPCIS (событий, которые происходят у читателей RFID). Затем эти события должны быть записаны в CSV-файл, чтобы загрузить их в любую базу данных и запустить на них аналитические алгоритмы.

Симулятор реализован с использованием python и отлично работает. То, что я сейчас пытаюсь сделать - это буферизовать запись событий в файл, чтобы уменьшить время, необходимое для доступа к диску. Просматривая документацию по python, я наткнулся на io.BufferedWriter, который звучит точно так же, как и то, что я искал. Во всяком случае, я не могу заставить его работать.

Вот что я сделал до сих пор. Я реализовал свой класс CsvWriter, который наследуется от RawIOBase и управляет дескриптором файла. Когда он создается, он создает BufferedWriter, передавая сам по себе, как параметр raw (может ли это быть проблемой?)

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

Реальные write методы, которые (как я понял) должны быть реализованы в самом классе CsvWriter, выглядят так:

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)

Кто-нибудь из вас знает, как это исправить?

...