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 sprintf
funcionalidad 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, buf
solo contendrá valores actuales, no valores anteriores. por ejemplo, lo primero buf
que escribí A= something ,B= something
más tarde C= something
se agregó en el mismo buf
, pero en sus respuestas de Python buf
contiene solo el último valor, que no es lo que quiero, quiero buf
tener todos los printf
mensajes 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
StringIO
instancia como un búfer:A diferencia
sprintf
, simplemente pasa una cadena abuf.write
, formateándola con el%
operador o elformat
método de cadenas.Por supuesto, podría definir una función para obtener la
sprintf
interfaz 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
Format
tambié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 unStringIO
objeto 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
StringIO
enfoque 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 unaprint
función. Este fragmento puede ser útil para poder insertar requisitos de depuración o paginación extraños:fuente