File khas ConfigParser yang dihasilkan terlihat seperti:
[Section]
bar=foo
[Section 2]
bar2= baz
Sekarang, apakah ada cara untuk mengindeks daftar seperti, misalnya:
[Section 3]
barList={
item1,
item2
}
Pertanyaan terkait: Kunci unik Python ConfigParser per bagian
python
configparser
pistacchio
sumber
sumber
Juga agak terlambat, tetapi mungkin bermanfaat bagi sebagian orang. Saya menggunakan kombinasi ConfigParser dan JSON:
baca saja dengan:
Anda bahkan dapat memutus garis jika daftar Anda panjang (terima kasih @ peter-smit):
Tentu saja saya bisa menggunakan JSON, tetapi saya menemukan file konfigurasi jauh lebih mudah dibaca, dan Bagian [DEFAULT] sangat berguna.
sumber
key5 : [r"abc $x_i$", r"def $y_j$"]
? Mereka memunculkan kesalahanjson.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
Datang terlambat ke pesta ini, tapi saya baru-baru ini menerapkan ini dengan bagian khusus dalam file konfigurasi untuk daftar:
dan gunakan
config.items( "paths" )
untuk mendapatkan daftar item jalur yang dapat diubah, seperti:Semoga ini bisa membantu orang lain Googling pertanyaan ini;)
sumber
; comment
mengeluarkan item tertentu dari daftar tanpa harus menulis ulang seluruh daftar.key
, karena ConfigParser mengonversi semua kunci tersebut menjadi huruf kecilconfig = ConfigParser.SafeConfigParser()
config.optionxform = str
KemudianSatu hal yang banyak orang tidak tahu adalah bahwa nilai konfigurasi multi-line diizinkan. Sebagai contoh:
Nilai
config.get('hello','barlist')
sekarang akan menjadi:Yang mudah Anda pisahkan dengan metode splitlines (jangan lupa untuk memfilter item kosong).
Jika kita melihat kerangka besar seperti Piramida, mereka menggunakan teknik ini:
Sumber
Saya sendiri, saya mungkin akan memperpanjang ConfigParser jika ini adalah hal yang umum untuk Anda:
Perhatikan bahwa ada beberapa hal yang harus diperhatikan ketika menggunakan teknik ini
sumber
.splitlines()
bukan.split()
? Menggunakan perilaku default masing-masing, split jelas lebih unggul (menyaring garis kosong). Kecuali saya kehilangan sesuatu ...Jika Anda ingin benar - benar lulus dalam daftar maka Anda dapat menggunakan:
Sebagai contoh konfigurasi:
Kode tersebut adalah:
keluaran:
sumber
ast.literal_eval()
ketika membandingkan dengan menggunakan (bisa dibilang lebih populer)json.loads()
? Saya pikir yang terakhir memberikan lebih banyak keamanan, bukan?Tidak disebutkan
converters
kwarg untukConfigParser()
jawaban ini agak mengecewakan.Menurut dokumentasi Anda dapat melewati kamus
ConfigParser
yang akan menambahkanget
metode untuk parser dan bagian proxy. Jadi untuk daftar:contoh.ini
Contoh Parser:
Ini adalah favorit pribadi saya karena tidak diperlukan subklasifikasi dan saya tidak harus bergantung pada pengguna akhir untuk menulis JSON atau daftar yang bisa ditafsirkan dengan sempurna
ast.literal_eval
.sumber
Saya mendarat di sini mencari untuk mengkonsumsi ini ...
Jawabannya adalah membaginya di koma dan menghapus spasi:
Untuk mendapatkan hasil daftar:
Ini mungkin tidak menjawab pertanyaan OP dengan tepat tetapi mungkin jawaban sederhana yang dicari beberapa orang.
sumber
[email protected]
! Tidak heran email saya terus melambung! > _ <Inilah yang saya gunakan untuk daftar:
konten file konfigurasi:
kode:
ini bekerja untuk string
dalam hal angka
konten konfigurasi:
kode:
Terima kasih.
sumber
Jadi cara lain, yang saya sukai, adalah dengan hanya membagi nilai-nilai, misalnya:
Dapat dimuat seperti ini ke daftar string atau integer, sebagai berikut:
Metode ini mencegah Anda dari perlu membungkus nilai-nilai Anda dalam tanda kurung untuk memuat sebagai JSON.
sumber
Hanya tipe primitif yang didukung untuk serialisasi oleh config parser. Saya akan menggunakan JSON atau YAML untuk persyaratan semacam itu.
sumber
Saya menghadapi masalah yang sama di masa lalu. Jika Anda membutuhkan daftar yang lebih rumit, pertimbangkan untuk membuat parser Anda sendiri dengan mewarisi dari ConfigParser. Maka Anda akan menimpa metode get dengan itu:
Dengan solusi ini Anda juga dapat mendefinisikan kamus di file konfigurasi Anda.
Tetapi berhati-hatilah! Ini tidak aman: ini berarti siapa pun dapat menjalankan kode melalui file konfigurasi Anda. Jika keamanan tidak menjadi masalah dalam proyek Anda, saya akan mempertimbangkan untuk menggunakan langsung kelas python sebagai file konfigurasi. Berikut ini jauh lebih kuat dan dapat dihabiskan daripada file ConfigParser:
sumber
barList=item1,item2
dan kemudian memanggilif value.find(',') > 0: return value.split(',')
, atau lebih baik lagi, memiliki aplikasi mengurai semua opsi konfigurasi sebagai daftar, dan hanya.split(',')
semuanya secara membabi buta?Jadi sekarang
config.cfg
file saya , yang bisa terlihat seperti ini:Dapat diuraikan menjadi benda yang cukup halus untuk proyek kecil saya.
Ini untuk penguraian konfigurasi sederhana yang sangat cepat, Anda kehilangan semua kemampuan untuk mengambil int, bools, dan tipe output lainnya tanpa mengubah objek yang dikembalikan
Parser
, atau melakukan kembali pekerjaan parsing yang dilakukan oleh kelas Parser di tempat lain.sumber
Saya menyelesaikan tugas serupa di proyek saya dengan bagian dengan kunci tanpa nilai:
Keluaran:
app.config:
sumber
json.loads
&ast.literal_eval
tampaknya berfungsi tetapi daftar sederhana dalam konfigurasi memperlakukan setiap karakter sebagai byte sehingga mengembalikan braket bahkan persegi ...artinya jika config telah
fieldvalue = [1,2,3,4,5]
kemudian
config.read(*.cfg)
config['fieldValue'][0]
kembali[
di tempat1
sumber
Seperti yang disebutkan oleh Peter Smit ( https://stackoverflow.com/a/11866695/7424596 ) Anda mungkin ingin memperluas ConfigParser, di samping itu, Interpolator dapat digunakan untuk secara otomatis mengkonversi ke dan dari daftar.
Untuk referensi di bagian bawah Anda dapat menemukan kode yang secara otomatis mengubah konfigurasi seperti:
Jadi, jika Anda meminta kunci, Anda akan mendapatkan:
Kode:
sumber