sprintf就像Python中的功能一样

时间:2011-03-15 09:49:27

标签: python string

我想创建一个字符串缓冲区来进行大量处理,格式化,最后使用Python中的C风格sprintf功能将缓冲区写入文本文件中。由于条件语句,我无法将它们直接写入文件。

例如伪代码:

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,就像C一样。

12 个答案:

答案 0 :(得分:148)

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

有关所有受支持的格式说明符,请参阅此reference

你也可以使用format

>>> print "This is the {}th tome of {}".format(5, "knowledge")
This is the 5th tome of knowledge

答案 1 :(得分:35)

如果我理解你的问题,format()就是你要找的,以及its mini-language

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!

答案 2 :(得分:17)

我不完全确定我了解您的目标,但您可以使用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

答案 3 :(得分:11)

使用formatting operator %

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

答案 4 :(得分:10)

您可以使用字符串格式:

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

答案 5 :(得分:6)

要插入一个非常长的字符串,最好使用不同参数的名称,而不是希望它们处于正确的位置。这也可以更容易地替换多次重复。

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

取自Format examples,其中还显示了所有其他Format相关答案。

答案 6 :(得分:3)

这可能是从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几乎完全相同。您也可以直接将字符串打印到文件中。如果涉及大量这些字符串格式的stringlets,使用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()

答案 7 :(得分:1)

我知道这是一个旧线程 - 但是有一个新的字符串插值“样式” - f'' 字符串格式构造。

a = 5
b = "hello"
buf = f"A = {a:d}\n , B = {b}\n" 

PEP-498 中指定了 F-String(如其所称)。

在学习 F-String 之前,我会调用如下格式:

a = 5
b = "hello"
buf = "A = {a:d}\n , B = {b}\n".format( **{ **globals() , **locals() } ) 

根据 PEP-498 文档,F-String 在 Python 3.6 或更高版本中可用。

答案 8 :(得分:0)

看看“Literal String Interpolation” https://www.python.org/dev/peps/pep-0498/

我通过http://www.malemburg.com/

找到了它

答案 9 :(得分:0)

类似...

name = "John"

print("Hello %s", name)

Hello John

答案 10 :(得分:0)

如果您想要类似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}"

答案 11 :(得分:0)

两种方法是写入字符串缓冲区或将行写入列表,然后再将它们连接。我认为StringIO方法更像pythonic,但在Python 2.6之前不起作用。

from io import StringIO

with StringIO() as s:
   print("Hello", file=s)
   print("Goodbye", file=s)
   # And later...
   with open('myfile', 'w') as f:
       f.write(s.getvalue())

您也可以在没有ContextManangers = StringIO())的情况下使用它们。当前,我正在使用带有print函数的上下文管理器类。此片段可能对插入调试或奇数页的需求很有用:

class Report:
    ... usual init/enter/exit
    def print(self, *args, **kwargs):
        with StringIO() as s:
            print(*args, **kwargs, file=s)
            out = s.getvalue()
        ... stuff with out

with Report() as r:
   r.print(f"This is {datetime.date.today()}!", 'Yikes!', end=':')