Me gustaría crear un buffer de cadena para hacer mucho procesamiento, formatear y finalmente escribir el buffer en un archivo de texto usando una sprintffuncionalidad de estilo C en Python. Debido a las declaraciones condicionales, no puedo escribirlas directamente en el archivo.
por ejemplo, seudocódigo:
sprintf(buf,"A = %d\n , B= %s\n",A,B)
/* some processing */
sprint(buf,"C=%d\n",c)
....
...
fprintf(file,buf)
Entonces, en el archivo de salida tenemos este tipo de o / p:
A= foo B= bar
C= ded
etc...
Editar, para aclarar mi pregunta:
buf es un gran búfer que contiene todas estas cadenas que se han formateado con sprintf. Siguiendo sus ejemplos, bufsolo contendrá valores actuales, no valores anteriores. por ejemplo, lo primero bufque escribí A= something ,B= somethingmás tarde C= somethingse agregó en el mismo buf, pero en sus respuestas de Python bufcontiene solo el último valor, que no es lo que quiero, quiero buftener todos los printfmensajes que he hecho desde el principio, como en C.

buf, no al final). Probablemente funcionaría mejor usar una matriz de cadenas, luego unirlas antes de escribir en el archivo.def sprintf(buf, fmt, *args): ...Respuestas:
Python tiene un
%operador para esto.Mira esto referencia para todos los especificadores de formato compatibles.
También podrías usar
format:fuente
Si entiendo su pregunta correctamente, format () es lo que está buscando, junto con su mini idioma .
Ejemplo tonto para python 2.7 y superior:
Para versiones anteriores de python: (probado con 2.6.2)
fuente
"{0} ...\r\n {1}!".format("Hello", "world")No estoy completamente seguro de entender su objetivo, pero puede usar una
StringIOinstancia como un búfer:A diferencia
sprintf, simplemente pasa una cadena abuf.write, formateándola con el%operador o elformatmétodo de cadenas.Por supuesto, podría definir una función para obtener la
sprintfinterfaz que espera:que se usaría así:
fuente
io.StringIO()lugarUse el operador de formateo
%:fuente
Puede usar el formato de cadena:
Pero esto se elimina en Python 3, debe usar "str.format ()":
fuente
format()puede ser preferible, pero%aún existe el formato. (Consulte mail.python.org/pipermail/python-dev/2009-September/092399.html para ver algunos de los motivos por los que no se desaprobó)Para insertar en una cadena muy larga, es bueno usar nombres para los diferentes argumentos, en lugar de esperar que estén en las posiciones correctas. Esto también facilita la sustitución de múltiples recurrencias.
Tomado de ejemplos de formato , donde
Formattambién se muestran todas las otras respuestas relacionadas.fuente
Esta es probablemente la traducción más cercana de su código C al código Python.
El
%operador en Python hace casi exactamente lo mismo que C'ssprintf. También puede imprimir la cadena en un archivo directamente. Si hay muchos de estos stringlets con formato de cadena involucrados, podría ser conveniente usar unStringIOobjeto para acelerar el tiempo de procesamiento.Entonces, en lugar de hacerlo
+=, haz esto:fuente
Si desea algo como la función de impresión python3 pero a una cadena:
o sin el
'\n'al final:fuente
Algo como...
fuente
Eche un vistazo a "Interpolación de cadenas literales" https://www.python.org/dev/peps/pep-0498/
Lo encontré a través de http://www.malemburg.com/
fuente
Dos enfoques son escribir en un buffer de cadena o escribir líneas en una lista y unirlas más tarde. Pienso que el
StringIOenfoque es más pitónico, pero no funcionó antes de Python 2.6.También puede usarlos sin un
ContextMananger(s = StringIO()). Actualmente, estoy usando una clase de administrador de contexto con unaprintfunción. Este fragmento puede ser útil para poder insertar requisitos de depuración o paginación extraños:fuente