sprintf就像Python中的function一样
我想创build一个string缓冲区来执行大量的处理,格式,最后使用Python中的C风格的sprintf
function将缓冲区写入文本文件中。 由于条件语句,我不能直接写入文件。
例如伪代码:
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格式化的string。 按照你的例子, buf
将只包含当前的值,而不是老的值。 例如,先在buf
写A= something ,B= something
稍后C= something
在同一个buf
添加了C= something
,但是在你的Python答案中buf
只包含最后一个值,这不是我想要的 – 我希望buf
将所有的printf
我从一开始就做了,就像在C
。
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
如果我正确地理解了你的问题,那么format()就是你正在寻找的,以及它的迷你语言 。
python2.7及以上的傻瓜例子:
>>> print "{} ...\r\n {}!".format("Hello", "world") Hello ... world!
对于较早的Python版本:(用2.6.2testing)
>>> print "{0} ...\r\n {1}!".format("Hello", "world") Hello ... world!
我并不完全确定我理解你的目标,但是你可以使用一个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
不同,您只需将string传递给buf.write
,然后使用%
运算符或string的format
方法对其进行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
使用格式化运算符%
:
buf = "A = %d\n , B= %s\n" % (a, b) print >>f, buf
您可以使用string格式:
>>> 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'
为了插入一个非常长的string,使用不同参数的名字是很好的,而不是希望它们处于正确的位置。 这也使得更换多个重复更容易。
>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W') 'Coordinates: 37.24N, -115.81W'
从格式示例中获取 ,其中还显示了所有其他与Format
相关的答案。
这可能是从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
几乎完全一样。 您也可以直接将string打印到文件。 如果涉及到很多这样的string格式化的StringIO
,那么使用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()
看看“string插值” https://www.python.org/dev/peps/pep-0498/