2009-07-15 33 views
6

Tôi đã nhận thấy với điều khiển nguồn của tôi rằng nội dung của tệp đầu ra được tạo bằng ConfigParser không bao giờ theo thứ tự như vậy. Đôi khi, các phần sẽ thay đổi địa điểm hoặc tùy chọn bên trong các phần ngay cả khi không có bất kỳ sửa đổi nào đối với các giá trị.Giữ các tệp đầu ra ConfigParser được sắp xếp

Có cách nào để giữ mọi thứ được sắp xếp trong tệp cấu hình để tôi không phải thực hiện các thay đổi nhỏ nhặt mỗi khi tôi khởi chạy ứng dụng của mình không?

+0

[Câu trả lời này] (http://stackoverflow.com/questions/1984759/export-with-alphabetical-sort-in-python-configparser/1984787#1984787) cho một câu hỏi tương tự cung cấp một số đề xuất về cách hoàn thành được sắp xếp đầu ra trong Python 2. –

Trả lời

8

Trông như thế này đã được cố định trong Python 3.1 và 2,7 với sự ra đời của bộ từ điển đã ra lệnh:

Thư viện chuẩn hiện hỗ trợ sử dụng từ điển đặt hàng trong một số mô-đun . Mô-đun configparser sử dụng theo mặc định. Điều này cho phép các tệp cấu hình được đọc, sửa đổi, và sau đó được viết lại trong đơn đặt hàng ban đầu của chúng.

+0

Doh. Hữu ích, nhưng phải chờ một vài năm trước khi chúng ta có thể sử dụng nó trong sản xuất ... – pihentagy

+3

Trong Python 2.7, bạn có thể 'từ bộ sưu tập nhập OrderedDict' và sử dụng' ConfigParser (dict_type = OrderedDict) 'để làm cho trình phân tích cú pháp sử dụng một từ điển được sắp xếp. Dựa trên một số lượng tối thiểu của thử nghiệm, tôi nghĩ rằng điều này sẽ phục vụ bạn tốt. – eksortso

+2

Trong Python 2.7 bạn không cần phải làm điều đó eksortso, nó là mặc định. –

3

No. Thư viện ConfigParser viết mọi thứ trong thứ tự băm từ điển. (Bạn có thể thấy điều này nếu bạn nhìn vào mã nguồn.) Có các thay thế cho mô-đun này làm một công việc tốt hơn.

Tôi sẽ xem liệu tôi có thể tìm và thêm nó vào đây hay không.

http://www.voidspace.org.uk/python/configobj.html#introduction là cái tôi đang nghĩ đến. Nó không phải là một thay thế thả, nhưng nó rất dễ sử dụng.

-1

ConfigParser dựa trên định dạng tệp ini, trong thiết kế của nó được cho là KHÔNG nhạy cảm với thứ tự. Nếu định dạng tệp cấu hình của bạn nhạy cảm với thứ tự, bạn không thể sử dụng ConfigParser. Nó cũng có thể nhầm lẫn giữa người nếu bạn có một định dạng ini kiểu đó là nhạy cảm với thứ tự của các báo cáo ...

+2

Nó vẫn hữu ích để có các mục đi ra trong cùng một thứ tự nếu bạn đang versioning các kết quả và muốn thấy diffs tìm kiếm hợp lý từ phiên bản cho phiên bản. – Arkady

+0

Ah, phải. Tôi hoàn toàn bỏ lỡ rằng bạn đã tạo ra các tập tin. Lỗi của tôi. Đó là configPARSER sau khi tất cả. ;) –

0

Nếu bạn muốn mang nó một bước xa hơn so với câu trả lời Alexander Ljungberg và cũng sắp xếp các bộ phận và các nội dung của phần bạn có thể sử dụng như sau:

config = ConfigParser.ConfigParser({}, collections.OrderedDict) 
config.read('testfile.ini') 
# Order the content of each section alphabetically 
for section in config._sections: 
    config._sections[section] = collections.OrderedDict(sorted(config._sections[section].items(), key=lambda t: t[0])) 

# Order all sections alphabetically 
config._sections = collections.OrderedDict(sorted(config._sections.items(), key=lambda t: t[0])) 

# Write ini file to standard output 
config.write(sys.stdout) 

này sử dụng OrderdDict điển (để giữ đặt hàng) và sắp xếp tệp ini đã đọc từ bên ngoài ConfigParser bằng cách ghi đè từ điển _sections nội bộ.

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