我想创建一个字符串缓冲区来进行大量处理,格式化,最后使用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
一样。
答案 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)
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/
找到了它答案 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())
您也可以在没有ContextMananger
(s = 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=':')