Объект для хранения строк в Python - PullRequest
1 голос
/ 12 марта 2010
class MyWriter:

    def __init__(self, stdout):
        self.stdout = stdout
        self.dumps = []

    def write(self, text):
        self.stdout.write(smart_unicode(text).encode('cp1251'))
        self.dumps.append(text)

    def close(self):
        self.stdout.close()   

writer = MyWriter(sys.stdout)
save = sys.stdout
sys.stdout = writer 

Я использую список self.dumps для хранения данных, полученных с отпечатков.Есть ли более удобный объект для хранения строковых строк в памяти?В идеале я хочу свалить это в одну большую строку.Я могу получить это так "\n".join(self.dumps) из кода выше.Может быть, лучше просто объединить строки - self.dumps += text?

Ответы [ 2 ]

2 голосов
/ 12 марта 2010

Список строк, которые нужно объединить с ''.join, просто в порядке. Однако, если вы предпочитаете более прямое решение:

import cStringIO

class MyWriter(object):

    def __init__(self, stdout):
        self.stdout = stdout
        self.dumps = cStringIO.StringIO()
        self.final = None

    def write(self, text):
        self.stdout.write(smart_unicode(text).encode('cp1251'))
        self.dumps.write(text)

    def close(self):
        self.stdout.close()
        self.final = self.dumps.getvalue()
        self.dumps.close()

    def getvalue(self):
        if self.final is not None:
            return self.final
        return self.dumps.getvalue()

getvalue нельзя вызвать для объекта string-io после его закрытия (закрытие объекта приводит к удалению его собственной буферной памяти), поэтому я делаю self.final непосредственно перед тем, как это произойдет. Помимо getvalue, объект string-io является довольно точной реализацией интерфейса «файлоподобный объект», поэтому он часто оказывается полезным, когда вам просто нужен какой-то фрагмент кода, изначально разработанный для print результаты, вместо этого сохраните их в памяти; но это также потенциально аккуратный способ «построить строку по частям» - просто write каждый кусок и getvalue, когда закончите (или в любое время в процессе, чтобы увидеть, что вы собрали до сих пор).

В современном стиле Python для этой задачи часто предпочитают подход с более низкой абстракцией (явно формируйте список строк и соединяйте их при необходимости), но нет ничего плохого в подходе "строкового ввода-вывода" с немного более высокой абстракцией либо.

(Третий подход, который кажется немного не в фаворе, состоит в том, чтобы оставить extend символов array.array, только для того, чтобы перечислить их; -).

1 голос
/ 12 марта 2010

Я совершенно уверен, что один '\n'.join(self.dumps) будет намного быстрее, чем self.dumps += text.

Объяснение: В Python строки неизменны, поэтому, если вы объединяете две строки, генерируется новая строка и две другие строки копируются в нее. Это не проблема, если вы сделаете это один раз, но внутри цикла это будет копировать весь текст на каждой итерации. join() с другой стороны - встроенная функция, написанная на C, которая имеет возможность эффективно перераспределять память и изменять конец строки. Таким образом, это должно быть намного быстрее.

Итак, ваш источник в порядке. Отличная работа!

PS: функция flush () отсутствует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...