Python 中类似 sprintf 的功能

176 投票
12 回答
373325 浏览
提问于 2025-04-16 13:43

我想创建一个字符串缓冲区,用来进行大量处理、格式化,最后把这个缓冲区的内容写入一个文本文件,想用类似C语言中sprintf的功能在Python中实现。因为有条件语句的关系,我不能直接把内容写入文件。

比如说伪代码:

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

所以在输出文件中,我们会得到这样的结果:

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

编辑,澄清一下我的问题:
buf是一个大的缓冲区,里面包含了所有用sprintf格式化过的字符串。根据你们的例子,buf只会包含当前的值,而不是之前的值。比如说,我第一次在buf中写了A= something ,B= something,后来又在同一个buf中添加了C= something,但是在你们的Python回答中,buf只包含最后一个值,这不是我想要的——我希望buf能保留从一开始到现在所有的printf输出,像在C中那样。

12 个回答

27

我不太确定我是否完全理解你的目标,但你可以使用一个 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
46

如果我理解你的问题没错的话,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!
209

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

撰写回答