2009-06-13 38 views
10

Tôi đã điều sau đây:tập tin đóng mở bởi ConfigParser

config = ConfigParser() 
config.read('connections.cfg') 
sections = config.sections() 

Làm thế nào tôi có thể đóng tập tin mở ra với config.read?

Trong trường hợp của tôi, khi các phần/dữ liệu mới được thêm vào tệp config.cfg, tôi cập nhật tiện ích wxtree của mình. Tuy nhiên, nó chỉ cập nhật một lần và tôi nghi ngờ đó là vì config.read để tệp mở.

Và trong khi chúng tôi đang ở đó, sự khác biệt chính giữa ConfigParserRawConfigParser là gì?

+1

Thôi nào, tài liệu là bạn của bạn: http://docs.python.org/library/configparser.html – Armandas

+5

Tôi đã đọc nó . Không thể tìm thấy cách đóng. Và đối với ConfigParser và RawConfigParser, sự khác biệt duy nhất tôi thấy là một số phương pháp. – sqram

Trả lời

9

Sử dụng readfp thay vì đọc:

with open('connections.cfg') as fp: 
    config = ConfigParser() 
    config.readfp(fp) 
    sections = config.sections() 
4

Để kiểm tra sự nghi ngờ của bạn, hãy sử dụng ConfigParser.readfp() và tự mình xử lý việc mở và đóng tệp. Thực hiện cuộc gọi readfp sau khi thực hiện các thay đổi.

config = ConfigParser() 
#...on each change 
fp = open('connections.cfg') 
config.readfp(fp) 
fp.close() 
sections = config.sections() 
+1

Điều này không hoạt động. 'readfp' chấp nhận một đối tượng tệp làm đối số, nhưng' read' của bạn chỉ chấp nhận một chuỗi có đường dẫn tệp. Có lẽ bạn chỉ quên 2 ký tự trong mã. – bluish

+1

Cảm ơn @ bluish, lỗi đánh máy sau 18 tháng là bằng chứng về sự liên quan ...Liên kết và văn bản là OK, bây giờ ví dụ mã được cố định. – gimel

+1

D tuyệt vời! bây giờ bạn xứng đáng là một upvote. Nếu bạn xóa bình luận của bạn, tôi sẽ xóa bài viết của tôi, vì vậy câu trả lời sẽ rõ ràng hơn để đọc;) – bluish

5

Sự khác biệt giữa ConfigParserRawConfigParserConfigParser sẽ cố gắng "kỳ diệu" mở rộng tài liệu tham khảo cho các biến cấu hình khác, như vậy:

x = 9000 %(y)s 
y = spoons 

Trong trường hợp này, x sẽ là 9000 spoonsy sẽ chỉ là spoons. Nếu bạn cần tính năng mở rộng này, các tài liệu khuyên bạn thay vì sử dụng SafeConfigParser. Tôi không biết điều gì khác biệt giữa hai người. Nếu bạn không cần mở rộng (bạn có thể không) chỉ cần RawConfigParser.

+0

cảm ơn vì điều này – sqram

17

ConfigParser.read(filenames) thực sự đảm nhiệm điều đó cho bạn.

Trong khi mã hóa tôi đã gặp phải vấn đề này và thấy mình tự hỏi mình những câu hỏi rất giống nhau:

Đọc về cơ bản có nghĩa là tôi cũng phải đóng cửa khu vực này sau khi tôi đang thực hiện với nó, phải không?

Tôi đọc câu trả lời bạn có ở đây đề xuất để tự mở tệp và sử dụng config.readfp(fp) làm phương án thay thế. Tôi nhìn vào số documentation và thấy rằng thực sự không có ConfigParser.close(). Vì vậy, tôi đã nghiên cứu nhiều hơn một chút và đọc thực hiện mã ConfigParser bản thân:

def read(self, filenames): 
    """Read and parse a filename or a list of filenames. 

    Files that cannot be opened are silently ignored; this is 
    designed so that you can specify a list of potential 
    configuration file locations (e.g. current directory, user's 
    home directory, systemwide directory), and all existing 
    configuration files in the list will be read. A single 
    filename may also be given. 

    Return list of successfully read files. 
    """ 
    if isinstance(filenames, basestring): 
     filenames = [filenames] 
    read_ok = [] 
    for filename in filenames: 
     try: 
      fp = open(filename) 
     except IOError: 
      continue 
     self._read(fp, filename) 
     fp.close() 
     read_ok.append(filename) 
    return read_ok 

Đây là read() phương pháp thực tế từ mã nguồn ConfigParser.py. Như bạn có thể thấy, dòng thứ 3 từ dưới cùng, fp.close() đóng tài nguyên đã mở sau khi sử dụng nó trong mọi trường hợp. Điều này được cung cấp cho bạn, đã được bao gồm trong hộp với ConfigParser.read() :)

+0

con đường để đi. Cảm ơn. – sqram

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