2012-01-16 7 views
59

Tôi cần đọc, viết và tạo một tệp INI bằng Python3.Cách đọc và ghi tệp INI bằng Python3?

FILE.INI

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

Python File:

# read file and if not exists 
ini = iniFile('FILE.INI') 

# Get and Print Config Line "default_path" 
getLine = ini.default_path 

# Print (string)/path/name 
print getLine 

# Append new line and if exists edit this line 
ini.append('default_path' , 'var/shared/') 

ini.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!!" 
+4

Làm thế nào về http://docs.python.org/library/configparser.html? –

+2

Thực tế, về http://stackoverflow.com/a/3220891/716118 thì sao? – voithos

Trả lời

89

Đâ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 official configparser documentation.

37

Dưới đây là ví dụ đọc, cập nhật và viết hoàn chỉnh.

tập tin đầu vào, test.ini

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

đang 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 tin đầ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 

Các tập tin đầu vào gốc vẫn còn nguyên.

3

Chuẩn ConfigParser thường yêu cầu quyền truy cập qua config['section_name']['key'], điều này thật không vui.Một thay đổi nhỏ có thể cung cấp truy cập thuộc tính:

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

AttrDict là một lớp học có nguồn gốc từ dict cho phép truy cập thông qua cả hai phím từ điển và thuộc tính truy cập: 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 tôi nhận application.ini với:

[general] 
key = value 

như

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

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

2

ConfigObj là một lựa chọn tốt để ConfigParser trong đó cung cấp sự linh hoạt hơn rất nhiều: phần

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

Nó có một số lưng bốc thăm:

  • Bạn không thể đặt dấu phân cách, nó phải được = ... (pull request)
  • Bạn không thể có giá trị rỗng, bạn cũng có thể nhưng họ trông thích: fuabr = thay vì chỉ fubar trông kỳ lạ và sai.
+1

Sardathrion là đúng, ConfigObj là con đường để đi nếu bạn muốn giữ các ý kiến ​​trong tập tin và thứ tự phần như trong tập tin gốc. ConfigParser sẽ chỉ xóa nhận xét của bạn và cũng sẽ tranh giành thứ tự tại một số điểm. – Arise