2011-07-08 31 views
22

Làm cách nào để viết nhận xét cho một tệp nhất định trong các phần?Viết nhận xét cho các tệp bằng ConfigParser

Nếu tôi có:

import ConfigParser 
with open('./config.ini', 'w') as f: 
    conf = ConfigParser.ConfigParser() 
    conf.set('DEFAULT', 'test', 1) 
    conf.write(f) 

tôi sẽ nhận được các file:

[DEFAULT] 
test = 1 

Nhưng làm thế nào tôi có thể nhận được một tập tin với ý kiến ​​bên [DEFAULT] phần, như:

[DEFAULT] 
; test comment 
test = 1 

Tôi biết tôi có thể viết mã cho các tệp bằng cách thực hiện:

import ConfigParser 
with open('./config.ini', 'w') as f: 
    conf = ConfigParser.ConfigParser() 
    conf.set('DEFAULT', 'test', 1) 
    conf.write(f) 
    f.write('; test comment') # but this gets printed after the section key-value pairs 

Đây có phải là khả năng với ConfigParser không? Và tôi không muốn thử một mô-đun khác vì tôi cần phải giữ cho chương trình của mình là "cổ phiếu" nhất có thể.

+0

Sau khi xem xét ConfigParser để viết file cấu hình, tôi quyết định viết tập tin của tôi sử dụng tập tin tiêu chuẩn cũ giao diện 'f = open ('test.ini', 'w'); f.write ('blabla') 'bởi vì mô-đun ConfigParser thậm chí không viết theo thứ tự định trước (vì nó sử dụng từ điển, mặc dù một trong các ví dụ nói rằng văn bản được thực hiện theo một thứ tự nào đó: [tài liệu python] (http://docs.python.org/library/configparser.html#examples)) – razvanc

+0

Nếu bạn vẫn ở xung quanh tôi sẽ đề nghị bạn viết một câu trả lời ngắn về vấn đề này và đánh dấu nó là được chấp nhận. Tôi đọc câu trả lời được đề xuất ngay cả sau khi nhận xét này và đi đến cùng một kết luận ... nhưng đã cho tôi một thời gian và tôi thậm chí đã bỏ phiếu cho giải pháp đã chọn của bạn ... – estani

Trả lời

19

Bạn có thể sử dụng allow_no_value tùy chọn nếu bạn có V ersion> = 2,7

đoạn này:

import ConfigParser 

config = ConfigParser.ConfigParser(allow_no_value=True) 
config.add_section('default_settings') 
config.set('default_settings', '; comment here') 
config.set('default_settings', 'test', 1) 
with open('config.ini', 'w') as fp: 
    config.write(fp) 


config = ConfigParser.ConfigParser(allow_no_value=True) 
config.read('config.ini') 
print config.items('default_settings') 

sẽ tạo ra một tập tin này như thế này:

+0

Như một lưu ý phụ, điều này hoạt động miễn là bạn không cố gắng viết bình luận trong phần 'DEFAULT' - có chức năng kiểm tra viết để tránh viết "= Không", nhưng chỉ khi không viết trong phần 'DEFAULT'. –

+0

Điểm tốt. May mắn thay, trong Python 3.6, module 'configparser' không có hành vi lạ này. Vì vậy, 'config = configparser.ConfigParser ({"; comment": None}, allow_no_value = True) 'chèn một chú thích trong phần mặc định, không có dấu móc' = None'. Để đảm bảo thứ tự chính xác của đầu ra, một 'collections.OrderedDict' là bắt buộc (thay vì' dict' như trong ví dụ của tôi). – EOL

+0

Tùy chọn này sẽ chỉ hoạt động trong trường hợp bạn đang tạo tệp mới. Nếu bạn đang chỉnh sửa tệp trước đó có nhận xét ngoài một phần, tất cả họ sẽ xóa: / – GEPD

3

Bạn có thể tạo biến bắt đầu bằng # hoặc; nhân vật:

conf.set('default_settings', '; comment here', '') 
conf.set('default_settings', 'test', 1) 

tạo file conf là

[default_settings] 
    ; comment here = 
    test = 1 

chức năng ConfigParser.read sẽ không phân tích giá trị đầu tiên

config = ConfigParser.ConfigParser() 
config.read('config.ini') 
print config.items('default_settings') 

cho

[('test','1')] 
+1

Khá xấu xí với dấu "=". – ThiefMaster

+0

Có lẽ đây là cách tốt nhất và duy nhất với ConfigParser. Cảm ơn – razvanc

+0

Bạn có thể loại bỏ dấu {= '. Khi bạn muốn viết bình luận, bạn chỉ bỏ qua đối số thứ ba khi gọi phương thức 'set'. Nếu không, bạn chỉ định cho nó một chuỗi rỗng, kết quả là dấu dẫn không mong muốn '='. – benregn

Các vấn đề liên quan