Gostaria de criar um buffer de cadeia para processar, formatar e finalmente gravar o buffer em um arquivo de texto usando uma sprintf
funcionalidade de estilo C em Python. Por causa de instruções condicionais, não posso gravá-las diretamente no arquivo.
por exemplo, pseudo código:
sprintf(buf,"A = %d\n , B= %s\n",A,B)
/* some processing */
sprint(buf,"C=%d\n",c)
....
...
fprintf(file,buf)
Portanto, no arquivo de saída, temos este tipo de o / p:
A= foo B= bar
C= ded
etc...
Edite, para esclarecer minha pergunta:
buf
é um grande buffer que contém todas essas strings que foram formatadas usando o sprintf. Seguindo seus exemplos, buf
conterá apenas valores atuais, não valores mais antigos. por exemplo, o primeiro em buf
que escrevi A= something ,B= something
mais tarde C= something
foi anexado no mesmo buf
, mas em suas respostas em Python buf
contém apenas o último valor, o que não é o que eu quero - quero buf
ter todos os printf
s que fiz desde o início, como em C
.
buf
e não no final.) Provavelmente seria melhor usar uma matriz de seqüências de caracteres e juntá-las antes de gravar no arquivo.def sprintf(buf, fmt, *args): ...
Respostas:
Python tem um
%
operador para isso.Consulte esta referência para todos os especificadores de formato suportados.
Você também pode usar
format
:fonte
Se eu entendi sua pergunta corretamente, format () é o que você está procurando, junto com seu mini-idioma .
Exemplo bobo para python 2.7 e superior:
Para versões anteriores do python: (testado com 2.6.2)
fonte
"{0} ...\r\n {1}!".format("Hello", "world")
Não tenho certeza absoluta de que entendi seu objetivo, mas você pode usar uma
StringIO
instância como um buffer:Ao contrário
sprintf
, você apenas passa uma string parabuf.write
, formatando-a com o%
operador ou oformat
método de strings.Obviamente, você pode definir uma função para obter a
sprintf
interface que deseja:que seria usado assim:
fonte
io.StringIO()
vezUse o operador de formatação
%
:fonte
Você pode usar a formatação de string:
Mas isso foi removido no Python 3, você deve usar "str.format ()":
fonte
format()
pode ser preferível, mas a%
formatação ainda existe. (Veja mail.python.org/pipermail/python-dev/2009-September/092399.html para algumas das razões por que não foi reprovado)Para inserir em uma string muito longa, é bom usar nomes para os diferentes argumentos, em vez de esperar que eles estejam nas posições corretas. Isso também facilita a substituição de várias recorrências.
Retirado de exemplos de formato , onde todas as outras
Format
respostas relacionadas também são mostradas.fonte
Esta é provavelmente a tradução mais próxima do seu código C para o código Python.
O
%
operador em Python faz quase exatamente a mesma coisa que os C'ssprintf
. Você também pode imprimir a sequência em um arquivo diretamente. Se houver muitas dessas strings formatadas em sequência envolvidas, pode ser aconselhável usar umStringIO
objeto para acelerar o tempo de processamento.Então, em vez de fazer
+=
, faça o seguinte:fonte
Se você deseja algo como a função de impressão python3, mas para uma string:
ou sem o
'\n'
no final:fonte
Algo como...
fonte
Dê uma olhada em "Interpolação de cordas literais" https://www.python.org/dev/peps/pep-0498/
Encontrei-o através do http://www.malemburg.com/
fonte
Duas abordagens são gravar em um buffer de cadeia ou escrever linhas em uma lista e juntá-las mais tarde. Eu acho que a
StringIO
abordagem é mais pitônica, mas não funcionou antes do Python 2.6.Você também pode usá-los sem um
ContextMananger
(s = StringIO()
). Atualmente, estou usando uma classe de gerenciador de contexto com umaprint
função. Esse fragmento pode ser útil para poder inserir requisitos de depuração ou paginação ímpar:fonte