Python 中类似 sprintf 的功能
我想创建一个字符串缓冲区,用来进行大量处理、格式化,最后把这个缓冲区的内容写入一个文本文件,想用类似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
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