Saya ingin membuat buffer string untuk melakukan banyak pemrosesan, memformat dan akhirnya menulis buffer dalam file teks menggunakan sprintf
fungsionalitas C-style di Python. Karena pernyataan kondisional, saya tidak dapat menulisnya langsung ke file.
mis. kode semu:
sprintf(buf,"A = %d\n , B= %s\n",A,B)
/* some processing */
sprint(buf,"C=%d\n",c)
....
...
fprintf(file,buf)
Jadi dalam file output kita memiliki o / p:
A= foo B= bar
C= ded
etc...
Edit, untuk memperjelas pertanyaan saya:
buf
apakah buffer besar berisi semua string yang telah diformat menggunakan sprintf. Mengikuti contoh Anda, buf
hanya akan berisi nilai saat ini, bukan nilai yang lebih lama. misalnya pertama di buf
saya tulis A= something ,B= something
kemudian C= something
ditambahkan dalam yang sama buf
, tetapi dalam jawaban Python Anda buf
hanya berisi nilai terakhir, yang tidak saya inginkan - Saya ingin buf
memiliki semua yang printf
telah saya lakukan sejak awal, seperti pada C
.
buf
, bukan di akhir.) Mungkin akan lebih baik menggunakan array string, kemudian bergabung bersama-sama sebelum Anda menulis ke file.def sprintf(buf, fmt, *args): ...
Jawaban:
Python memiliki
%
operator untuk ini.Lihat referensi ini untuk semua penentu format yang didukung.
Anda juga bisa menggunakan
format
:sumber
Jika saya memahami pertanyaan Anda dengan benar, format () adalah apa yang Anda cari, beserta bahasa mini-nya .
Contoh konyol untuk python 2.7 dan lebih tinggi:
Untuk versi python sebelumnya: (diuji dengan 2.6.2)
sumber
"{0} ...\r\n {1}!".format("Hello", "world")
Saya tidak sepenuhnya yakin bahwa saya memahami tujuan Anda, tetapi Anda dapat menggunakan
StringIO
contoh sebagai penyangga:Tidak seperti
sprintf
, Anda hanya meneruskan stringbuf.write
, memformatnya dengan%
operator atauformat
metode string.Anda tentu saja dapat mendefinisikan fungsi untuk mendapatkan
sprintf
antarmuka yang Anda harapkan:yang akan digunakan seperti ini:
sumber
io.StringIO()
bukannyaGunakan operator pemformatan
%
:sumber
Anda dapat menggunakan pemformatan string:
Tapi ini dihapus di Python 3, Anda harus menggunakan "str.format ()":
sumber
format()
mungkin lebih disukai tetapi%
format masih ada. (Lihat mail.python.org/pipermail/python-dev/2009-September/092399.html untuk beberapa alasan mengapa itu tidak ditinggalkan)Untuk memasukkan ke dalam string yang sangat panjang, itu baik untuk menggunakan nama untuk argumen yang berbeda, daripada berharap mereka berada di posisi yang tepat. Ini juga membuatnya lebih mudah untuk mengganti beberapa perulangan.
Diambil dari Contoh format , di mana semua
Format
jawaban terkait lainnya juga ditampilkan.sumber
Ini mungkin terjemahan terdekat dari kode C Anda ke kode Python.
The
%
operator dalam Python tidak hampir persis sama dengan Csprintf
. Anda juga dapat mencetak string ke file secara langsung. Jika ada banyak stringlets string berformat ini yang terlibat, mungkin bijaksana untuk menggunakanStringIO
objek untuk mempercepat waktu pemrosesan.Jadi alih-alih melakukan
+=
, lakukan ini:sumber
Jika Anda ingin sesuatu seperti fungsi cetak python3 tetapi ke string:
atau tanpa
'\n'
di akhir:sumber
Sesuatu seperti...
sumber
Lihatlah "Interpolasi String Literal" https://www.python.org/dev/peps/pep-0498/
Saya menemukannya melalui http://www.malemburg.com/
sumber
Dua pendekatan adalah menulis ke buffer string atau menulis baris ke daftar dan bergabung nanti. Saya pikir
StringIO
pendekatannya lebih pythonic, tetapi tidak berhasil sebelum Python 2.6.Anda juga dapat menggunakan ini tanpa
ContextMananger
(s = StringIO()
). Saat ini, saya menggunakan kelas manajer konteks denganprint
fungsi. Fragmen ini mungkin berguna untuk dapat memasukkan persyaratan debugging atau paging aneh:sumber