2012-07-09 33 views
7

Tôi có một tập tin cấu hình sử dụng configParser:Các dòng mới với ConfigParser?

<br> 
[ section one ]<br> 
one = Y,Z,X <br><br> 
[EG 2]<br> 
ias = X,Y,Z<br> 

chương trình tôi làm việc đọc và xử lý các giá trị tốt.

Tuy nhiên, một số phần sẽ khá lớn. Tôi cần một tập tin cấu hình mà sẽ cho phép các giá trị phải được trên một dòng mới, như thế này:

[EG SECTION]<br> 
EG=<br> 
item 1 <br> 
item 2 <br> 
item 3<br> 
etc... 

Trong mã của tôi Tôi có một chức năng đơn giản mà phải mất một delimiter (hoặc tách) của các giá trị sử dụng string.split() rõ ràng hiện nay đặt thành dấu phẩy. Tôi đã thử chuỗi thoát của \n không hoạt động.

Có ai biết nếu điều này là có thể với trình phân tích cú pháp cấu hình của python không?
http://docs.python.org/library/configparser.html

# We need to extract data from the config 
def getFromConfig(currentTeam, section, value, delimeter): 
    cp = ConfigParser.ConfigParser() 
    fileName = getFileName(currentTeam) 
    cp.read(fileName) 
    try: 
     returnedString = cp.get(section, value) 
    except: # The config file could be corrupted 
     print("Error reading " + fileName + " configuration file.") 
     sys.exit(1) #Stop us from crashing later 
    if delimeter != "": # We may not need to split 
     returnedList = returnedString.split(delimeter) 
    return returnedList 

Tôi sẽ sử dụng cho việc này:

taskStrings = list(getFromConfig(teamName, "Y","Z",",")) 

Trả lời

10

docstring Các ConfigParser _read() phương pháp cho biết:

continuations được đại diện bởi một newline nhúng sau đó dẫn đầu là khoảng trắng.

Hoặc cách khác (như các phiên bản bằng Python 3 đặt nó):

Giá trị có thể span nhiều dòng, miễn là họ đang thụt vào sâu hơn dòng đầu tiên của các giá trị.

Tính năng này cung cấp phương tiện để chia nhỏ giá trị và "tiếp tục" chúng trên nhiều dòng. Ví dụ, vì vậy bạn có một tập tin cấu hình có tên 'test.ini' trong đó có:

[EG SECTION]<br> 
EG=<br> 
    item 1<br> 
    item 2<br> 
    item 3<br> 

Bạn có thể đọc giá trị của EG trong EG SECTION vào một danh sách với mã như thế này:

try: 
    import ConfigParser as configparser 
except ImportError: # Python 3 
    import configparser 

cp = configparser.ConfigParser() 
cp.read('test.ini') 

eg = cp.get('EG SECTION', 'EG') 
print(repr(eg)) # -> '\nitem 1\nitem 2\nitem 3' 

cleaned = [item for item in eg.strip().split('\n')] 
print(cleaned) # -> ['item 1', 'item 2', 'item 3'] 
+0

Có bất kỳ mức độ làm tổ nào không? Giống như, nói rằng tôi có một phần dự định trong đó một trong những giá trị lại một lần nữa dự định. Điều này một lần nữa có một giá trị mà là phụ dự định và vv! – Nishant

+1

@Nantant: Giả sử bạn có nghĩa là "thụt lề": Trước hết bạn có thể dễ dàng tự trả lời câu hỏi (bằng cách thử nó, nếu không có gì khác).Tuy nhiên để tiết kiệm cho bạn những rắc rối - nó không quan trọng bao nhiêu mục được thụt vào, chỉ cho dù họ có hay không. – martineau

+0

Tôi có nghĩa là thụt vào xin lỗi. Tôi nhận được một phần rằng nó có thể được thụt vào bất kỳ chiều sâu nào, nhưng ý tôi là gì nếu có một mục bổ sung trong đó * sâu sắc * thụt vào những thứ có * sâu hơn nữa * các mặt hàng thụt vào? Trường hợp bình thường của làm tổ tôi có ý nghĩa. Tôi đoán mức độ thứ ba trong trường hợp này. Tôi hy vọng bạn nhận được nó, nếu không nó tốt :-) Tôi sẽ thử nó ra và có lẽ gửi một câu hỏi! – Nishant

2

Dường như có thể. Trong tập tin cấu hình của riêng tôi, ví dụ, tôi có một đối tượng danh sách với các bộ:

[root] 
path:/
redirectlist: [ (r'^magic', '/file'), 
    (r'^avplay', '/file'), 
    (r'^IPTV', '/file'), 
    (r'^box', '/file'), 
    (r'^QAM', '/qam'), 
    (r'.*opentv.*', '/qam'), 
    (r'.+', '/file') ] 

và tôi làm:

redirectstr = _configdict.get('root', 'redirectlist') 
redirects = eval(redirectstr) 

lưu ý rằng tôi thực sự eval'ing dòng đó, có thể gây an ninh vi phạm nếu được sử dụng trong tự nhiên.

+6

Dường như bạn có thể làm điều này một cách an toàn bằng cách thay thế 'eval' bằng' ast.literal_eval', trừ khi bạn cho phép người dùng nhập các đối tượng không phải là các đối tượng python đơn giản (từ điển, chuỗi, danh sách, bộ dữ liệu, phao và số nguyên). – mgilson

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