sprintf как функциональность в Python - PullRequest
110 голосов
/ 15 марта 2011

Я хотел бы создать строковый буфер для выполнения большой обработки, форматирования и, наконец, записи буфера в текстовый файл, используя функциональность C-style sprintf в Python.Из-за условных операторов я не могу записать их непосредственно в файл.

например, псевдокод:

sprintf(buf,"A = %d\n , B= %s\n",A,B)
/* some processing */
sprint(buf,"C=%d\n",c)
....
...
fprintf(file,buf)

Так что в выходном файле мы имеем такой тип o / p:

A= foo B= bar
C= ded
etc...

Редактировать, чтобы уточнить мой вопрос:
buf - это большой буфер, содержащий все эти строки, отформатированные с использованием sprintf.Судя по вашим примерам, buf будет содержать только текущие значения, а не более старые.Например, сначала в buf я написал A= something ,B= something, позже C= something был добавлен в том же buf, но в ваших ответах на Python buf содержит только последнее значение, чего я не хочу - я хочу, чтобы buf имелвсе printf s, которые я сделал с самого начала, как в C.

Ответы [ 10 ]

149 голосов
/ 15 марта 2011

В Python есть оператор % для этого.

>>> a = 5
>>> b = "hello"
>>> buf = "A = %d\n , B = %s\n" % (a, b)
>>> print buf
A = 5
 , B = hello

>>> c = 10
>>> buf = "C = %d\n" % c
>>> print buf
C = 10

См. Эту ссылку для всех поддерживаемых спецификаторов формата.

Вы также можете использовать format:

>>> print "This is the {}th tome of {}".format(5, "knowledge")
This is the 5th tome of knowledge
36 голосов
/ 15 марта 2011

Если я правильно понимаю ваш вопрос, format () - это то, что вы ищете, наряду с его мини-языком .

Глупый пример для python 2.7и выше:

>>> print "{} ...\r\n {}!".format("Hello", "world")
Hello ...
 world!

Для более ранних версий Python: (протестировано с 2.6.2)

>>> print "{0} ...\r\n {1}!".format("Hello", "world")
Hello ...
 world!
17 голосов
/ 29 августа 2013

Я не совсем уверен, что понимаю вашу цель, но вы можете использовать экземпляр StringIO в качестве буфера:

>>> import StringIO 
>>> buf = StringIO.StringIO()
>>> buf.write("A = %d, B = %s\n" % (3, "bar"))
>>> buf.write("C=%d\n" % 5)
>>> print(buf.getvalue())
A = 3, B = bar
C=5

В отличие от sprintf, вы просто передаете строку в buf.write, форматируя его с помощью оператора % или метода format строк.

Конечно, вы можете определить функцию для получения интерфейса sprintf, на который вы надеетесь:

def sprintf(buf, fmt, *args):
    buf.write(fmt % args)

, который будет использоваться следующим образом:

>>> buf = StringIO.StringIO()
>>> sprintf(buf, "A = %d, B = %s\n", 3, "foo")
>>> sprintf(buf, "C = %d\n", 5)
>>> print(buf.getvalue())
A = 3, B = foo
C = 5
11 голосов
/ 15 марта 2011

Используйте оператор форматирования %:

buf = "A = %d\n , B= %s\n" % (a, b)
print >>f, buf
10 голосов
/ 15 марта 2011

Вы можете использовать форматирование строки:

>>> a=42
>>> b="bar"
>>> "The number is %d and the word is %s" % (a,b)
'The number is 42 and the word is bar'

Но это удалено в Python 3, вы должны использовать "str.format ()":

>>> a=42
>>> b="bar"
>>> "The number is {0} and the word is {1}".format(a,b)
'The number is 42 and the word is bar'
6 голосов
/ 29 августа 2013

Для вставки в очень длинную строку желательно использовать имена для разных аргументов, вместо того, чтобы надеяться, что они находятся в правильных позициях. Это также облегчает замену нескольких повторений.

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'

Взято из Примеры форматов , где также показаны все остальные Format связанные ответы.

3 голосов
/ 15 марта 2011

Вероятно, это наиболее близкий перевод вашего кода C в код Python.

A = 1
B = "hello"
buf = "A = %d\n , B= %s\n" % (A, B)

c = 2
buf += "C=%d\n" % c

f = open('output.txt', 'w')
print >> f, c
f.close()

Оператор % в Python делает почти то же самое, что и оператор C sprintf. Вы также можете распечатать строку в файл напрямую. Если задействовано много этих строковых форматированных строк, то может быть целесообразно использовать объект StringIO для ускорения обработки.

Поэтому вместо += сделайте следующее:

import cStringIO
buf = cStringIO.StringIO()

...

print >> buf, "A = %d\n , B= %s\n" % (A, B)

...

print >> buf, "C=%d\n" % c

...

print >> f, buf.getvalue()
0 голосов
/ 12 мая 2019

Если вы хотите что-то вроде функции печати python3, но в виде строки:

def sprint(*args, **kwargs):
    sio = io.StringIO()
    print(*args, **kwargs, file=sio)
    return sio.getvalue()
>>> x = sprint('abc', 10, ['one', 'two'], {'a': 1, 'b': 2}, {1, 2, 3})
>>> x
"abc 10 ['one', 'two'] {'a': 1, 'b': 2} {1, 2, 3}\n"

или без '\n' в конце:

def sprint(*args, end='', **kwargs):
    sio = io.StringIO()
    print(*args, **kwargs, end=end, file=sio)
    return sio.getvalue()
>>> x = sprint('abc', 10, ['one', 'two'], {'a': 1, 'b': 2}, {1, 2, 3})
>>> x
"abc 10 ['one', 'two'] {'a': 1, 'b': 2} {1, 2, 3}"
0 голосов
/ 31 января 2019

Что-то вроде ...

name = "John"

print("Hello %s", name)

Hello John
0 голосов
/ 19 февраля 2016

Взгляните на «Литеральную строковую интерполяцию» https://www.python.org/dev/peps/pep-0498/

Я нашел ее через http://www.malemburg.com/

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