จะอ่านและเขียนไฟล์ INI ด้วย Python3 ได้อย่างไร?


119

ฉันต้องการอ่านเขียนและสร้างไฟล์ INIด้วย Python3

FILE.INI

default_path = "/path/name/"
default_file = "file.txt"

ไฟล์ Python:

#    Read file and and create if it not exists
config = iniFile( 'FILE.INI' )

#    Get "default_path"
config.default_path

#    Print (string)/path/name
print config.default_path

#    Create or Update
config.append( 'default_path', 'var/shared/' )
config.append( 'default_message', 'Hey! help me!!' )

อัปเดต FILE.INI

default_path    = "var/shared/"
default_file    = "file.txt"
default_message = "Hey! help me!!"


2
จริงๆแล้วstackoverflow.com/a/3220891/716118ล่ะ
voithos

ไฟล์ ini ที่เหมาะสมต้องมีส่วนหัวเช่น[foobar].
Martin Thoma

คำตอบ:


148

สิ่งนี้สามารถเริ่มต้นด้วย:

import configparser

config = configparser.ConfigParser()
config.read('FILE.INI')
print(config['DEFAULT']['path'])     # -> "/path/name/"
config['DEFAULT']['path'] = '/var/shared/'    # update
config['DEFAULT']['default_message'] = 'Hey! help me!!'   # create

with open('FILE.INI', 'w') as configfile:    # save
    config.write(configfile)

คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่เอกสาร configparser อย่างเป็นทางการ


4
ให้configparser.MissingSectionHeaderErrorเมื่อใช้ไฟล์ตัวอย่างที่มีให้โดยไม่มีส่วนหัวที่เหมาะสม
Jaakko

81

นี่คือตัวอย่างการอ่านอัปเดตและเขียนฉบับสมบูรณ์

อินพุตไฟล์ test.ini

[section_a]
string_val = hello
bool_val = false
int_val = 11
pi_val = 3.14

รหัสการทำงาน

try:
    from configparser import ConfigParser
except ImportError:
    from ConfigParser import ConfigParser  # ver. < 3.0

# instantiate
config = ConfigParser()

# parse existing file
config.read('test.ini')

# read values from a section
string_val = config.get('section_a', 'string_val')
bool_val = config.getboolean('section_a', 'bool_val')
int_val = config.getint('section_a', 'int_val')
float_val = config.getfloat('section_a', 'pi_val')

# update existing value
config.set('section_a', 'string_val', 'world')

# add a new section and some values
config.add_section('section_b')
config.set('section_b', 'meal_val', 'spam')
config.set('section_b', 'not_found_val', '404')

# save to a file
with open('test_update.ini', 'w') as configfile:
    config.write(configfile)

ไฟล์ผลลัพธ์ test_update.ini

[section_a]
string_val = world
bool_val = false
int_val = 11
pi_val = 3.14

[section_b]
meal_val = spam
not_found_val = 404

ไฟล์อินพุตต้นฉบับยังคงไม่ถูกแตะต้อง


ในระบบ Python 3.7 ของฉันบรรทัด "config.set ('section_b', 'not_found_val', 404)" ต้องเปลี่ยนเป็น "config.set ('section_b', 'not_found_val', str (404))" เนื่องจาก พารามิเตอร์สำหรับ "set" ต้องเป็นสตริง เป็นตัวอย่างที่ยอดเยี่ยมขอบคุณ!
Mr Ed

ดูเหมือนว่าread เมธอดจะส่งคืนรายการไฟล์ / ไฟล์ที่อ่านแล้ว แต่ไม่ใช่เนื้อหา
YTerle


5

มาตรฐานConfigParserโดยปกติต้องมีการเข้าถึงผ่านconfig['section_name']['key']ซึ่งไม่สนุก การแก้ไขเล็กน้อยสามารถให้การเข้าถึงแอตทริบิวต์:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

AttrDictเป็นคลาสที่ได้มาdictซึ่งอนุญาตให้เข้าถึงผ่านทั้งคีย์พจนานุกรมและการเข้าถึงแอตทริบิวต์นั่นหมายความว่าa.x is a['x']

เราสามารถใช้คลาสนี้ในConfigParser:

config = configparser.ConfigParser(dict_type=AttrDict)
config.read('application.ini')

และตอนนี้เราได้รับapplication.iniกับ:

[general]
key = value

เช่น

>>> config._sections.general.key
'value'

6
เคล็ดลับที่ดี แต่ผู้ใช้วิธีนี้ควรดูแลว่าเมื่อเข้าถึงแบบconfig._sections.general.key = "3"นี้จะไม่เปลี่ยนค่าภายในของตัวเลือก config ดังนั้นจึงสามารถใช้ได้สำหรับการเข้าถึงแบบอ่านเท่านั้น ถ้าหลังจาก.read()คำสั่ง config ถูกขยายหรือเปลี่ยนแปลง (เพิ่มตัวเลือกคู่ค่าสำหรับบางส่วน -> ซึ่งทำการแก้ไขซึ่งอาจสำคัญมาก) ไม่ควรใช้วิธีการเข้าถึงนี้! นอกจากนี้การเข้าถึงใด ๆconfig._sections["section"]["opt"]ที่เป็นการหลีกเลี่ยงการแก้ไขแบบส่วนตัวและส่งคืนค่าดิบ!
Gabriel

5

ConfigObjเป็นทางเลือกที่ดีสำหรับ ConfigParser ซึ่งมีความยืดหยุ่นมากกว่า:

  • ส่วนที่ซ้อนกัน (ส่วนย่อย) ไปยังระดับใดก็ได้
  • แสดงรายการค่า
  • ค่าหลายบรรทัด
  • การแก้ไขสตริง (การทดแทน)
  • รวมเข้ากับระบบตรวจสอบความถูกต้องที่มีประสิทธิภาพรวมถึงการตรวจสอบประเภทอัตโนมัติ / การแปลงส่วนที่ทำซ้ำและอนุญาตค่าเริ่มต้น
  • เมื่อเขียนไฟล์กำหนดค่า ConfigObj จะรักษาข้อคิดเห็นทั้งหมดและลำดับของสมาชิกและส่วนต่างๆ
  • วิธีการและตัวเลือกที่มีประโยชน์มากมายสำหรับการทำงานกับไฟล์คอนฟิกูเรชัน (เช่นวิธี 'โหลดซ้ำ')
  • รองรับ Unicode เต็มรูปแบบ

มีข้อเสียอยู่บ้าง:

  • คุณไม่สามารถตั้งค่าตัวคั่นได้ต้องเป็น=... ( คำขอดึง )
  • คุณไม่สามารถมีค่าว่างเปล่า แต่คุณสามารถทำได้ แต่ดูเหมือนว่า: fuabr =แทนที่จะfubarดูแปลกและผิด

1
Sardathrion ถูกต้อง ConfigObj เป็นวิธีที่จะไปหากคุณต้องการเก็บความคิดเห็นไว้ในไฟล์และลำดับส่วนเหมือนในไฟล์ต้นฉบับ ConfigParser จะล้างความคิดเห็นของคุณและจะแย่งลำดับในบางจุด
เกิดขึ้น

2

เนื้อหาในไฟล์backup_settings.iniของฉัน

[Settings]
year = 2020

รหัสหลามสำหรับการอ่าน

import configparser
config = configparser.ConfigParser()
config.read('backup_settings.ini') #path of your .ini file
year = config.get("Settings","year") 
print(year)

สำหรับการเขียนหรือปรับปรุง

from pathlib import Path
import configparser
myfile = Path('backup_settings.ini')  #Path of your .ini file
config.read(myfile)
config.set('Settings', 'year','2050') #Updating existing entry 
config.set('Settings', 'day','sunday') #Writing new entry
config.write(myfile.open("w"))

เอาท์พุต

[Settings]
year = 2050
day = sunday

สิ่งนี้เป็นเสน่ห์และสะอาด!
Rodrigo.A92
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.