Làm cách nào để đọc và ghi tệp INI với Python3?


118

Tôi cần đọc, ghi và tạo tệp INI bằng Python3.

FILE.INI

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

Tệp 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!!' )

CẬP NHẬT FILE.INI

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


2
Trên thực tế, còn stackoverflow.com/a/3220891/716118 thì sao?
voithos

một tệp ini thích hợp cần một tiêu đề phần như [foobar].
Martin Thoma

Câu trả lời:


148

Đây có thể là một cái gì đó để bắt đầu với:

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)

Bạn có thể tìm thêm tại tài liệu chính thức của trình phân tích cấu hình .


4
Cung cấp configparser.MissingSectionHeaderErrorkhi sử dụng tệp ví dụ được cung cấp mà không có tiêu đề phần thích hợp.
Jaakko

81

Đây là một ví dụ hoàn chỉnh về đọc, cập nhật và ghi.

Tệp đầu vào, test.ini

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

Mã làm việc.

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)

Tệp đầu ra, 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

Tệp đầu vào ban đầu vẫn còn nguyên.


Trên hệ thống Python 3.7 của tôi, dòng "config.set ('section_b', 'not_found_val', 404)" phải được thay đổi thành "config.set ('section_b', 'not_found_val', str (404))" vì tham số cho "set" phải là chuỗi. Ví dụ xuất sắc, cảm ơn!
Mr Ed

trông giống như các read phương pháp hiện nay trả về một danh sách các file đọc / tập tin, nhưng không phải là nội dung
YTerle


5

Tiêu chuẩn này ConfigParserthường yêu cầu quyền truy cập thông qua config['section_name']['key'], điều này không có gì thú vị. Một chút sửa đổi có thể mang lại quyền truy cập thuộc tính:

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

AttrDictlà một lớp có nguồn gốc từ dictđó cho phép truy cập qua cả khóa từ điển và truy cập thuộc tính: điều đó có nghĩa làa.x is a['x']

Chúng ta có thể sử dụng lớp này trong ConfigParser:

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

và bây giờ chúng ta có application.ini:

[general]
key = value

như

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

6
mẹo hay, nhưng người dùng phương pháp này nên cẩn thận, rằng khi truy cập như thế config._sections.general.key = "3"này không làm thay đổi giá trị bên trong của tùy chọn cấu hình và do đó chỉ có thể được sử dụng cho quyền truy cập chỉ đọc. Nếu sau .read()lệnh, cấu hình được mở rộng hoặc thay đổi (thêm tùy chọn, cặp giá trị cho một số phần, -> thực hiện nội suy có thể rất quan trọng) thì không nên sử dụng phương pháp truy cập này! Ngoài ra, bất kỳ quyền truy cập nào vào config._sections["section"]["opt"]đó là nội suy đường vòng riêng tư và trả về các giá trị thô!
Gabriel

5

ConfigObj là một giải pháp thay thế tốt cho ConfigParser mang lại sự linh hoạt hơn rất nhiều:

  • Các phần lồng nhau (phần phụ), ở mọi cấp độ
  • Liệt kê các giá trị
  • Nhiều giá trị dòng
  • Nội suy chuỗi (thay thế)
  • Tích hợp với hệ thống xác nhận mạnh mẽ bao gồm kiểm tra kiểu tự động / chuyển đổi các phần lặp lại và cho phép các giá trị mặc định
  • Khi viết ra các tệp cấu hình, ConfigObj lưu giữ tất cả các nhận xét và thứ tự của các thành viên và các phần
  • Nhiều phương pháp và tùy chọn hữu ích để làm việc với các tệp cấu hình (như phương pháp 'tải lại')
  • Hỗ trợ đầy đủ Unicode

Nó có một số rút lui:

  • Bạn không thể đặt dấu phân cách, nó phải là =… ( yêu cầu kéo )
  • Bạn không thể có các giá trị trống, bạn có thể nhưng chúng trông giống như: fuabr =thay vì chỉ fubartrông kỳ lạ và sai.

1
Sardathrion nói đúng, ConfigObj là cách tốt nhất nếu bạn muốn giữ các nhận xét trong tệp và thứ tự phần như trong tệp gốc. ConfigParser sẽ chỉ xóa nhận xét của bạn và cũng sẽ xáo trộn thứ tự tại một số điểm.
Tăng

1

nội dung trong tệp backup_settings.ini của tôi

[Settings]
year = 2020

mã python để đọc

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

để viết hoặc cập nhật

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"))

đầu ra

[Settings]
year = 2050
day = sunday
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.