2009-08-21 2 views
8

При использовании модуля ConfigParser я хотел бы использовать значения, содержащие несколько слов, заданных в файле cfg. В этом случае кажется тривиальным для меня окружают строку в кавычки, как (example.cfg):Python ConfigParser - значения между кавычками

[GENERAL] 
onekey = "value in some words" 

Моя проблема заключается в том, что в этом случае питона добавляет кавычки в строку, а также при использовании значения вроде этого:

config = ConfigParser() 
config.read(["example.cfg"]) 
print config.get('GENERAL', 'onekey') 

Я уверен, что есть встроенная функция, позволяющая печатать только 'value in some words' вместо '"value in some words"'. Как это возможно? Благодарю.

ответ

9

Я ничего не видел в the configparser manual, но вы можете просто использовать метод строк, чтобы избавиться от ведущих и завершающих двойных кавычек.

>>> s = '"hello world"' 
>>> s 
'"hello world"' 
>>> s.strip('"') 
'hello world' 
>>> s2 = "foo" 
>>> s2.strip('"') 
'foo' 

Как вы можете видеть, .strip не изменяет строку, если она не начинается и заканчивается с указанной строкой.

+0

Обратите внимание на последнее предложение должно быть обновлено. 'strip()' ДЕЙСТВИТЕЛЬНО модифицирует строку, если она начинается OR, заканчивается указанной строкой. например ''" bar..strip ("'") 'возвращает' 'bar', а не 'bar'. – Jonny

2

Извините, решение было тривиально, так как я могу просто оставить кавычки, он выглядит, что python просто берет правую сторону от знака равенства.

0

Дэви,

Как вы говорите, что вы можете просто оставить кавычки от вашей строки.

Для проекта, над которым я работаю, я хотел быть в состоянии представить почти любой строковый литерал Python в качестве значения для некоторых моих параметров конфигурации и более того, что я хотел бы обрабатывать некоторые из них как необработанные строковые литералы. (Я хочу, чтобы этот конфиг мог обрабатывать такие вещи, как \ n, \ x1b и т. Д.).

В этом случае я использовал что-то вроде:

def EvalStr(s, raw=False): 
    r'''Attempt to evaluate a value as a Python string literal or 
     return s unchanged. 

     Attempts are made to wrap the value in one, then the 
     form of triple quote. If the target contains both forms 
     of triple quote, we'll just punt and return the original 
     argument unmodified. 

     Examples: (But note that this docstring is raw!) 
     >>> EvalStr(r'this\t is a test\n and only a \x5c test') 
     'this\t is a test\n and only a \\ test' 

     >>> EvalStr(r'this\t is a test\n and only a \x5c test', 'raw') 
     'this\\t is a test\\n and only a \\x5c test' 
    ''' 

    results = s ## Default returns s unchanged 
    if raw: 
     tmplate1 = 'r"""%s"""' 
     tmplate2 = "r'''%s'''" 
    else: 
     tmplate1 = '"""%s"""' 
     tmplate2 = "'''%s'''" 

    try: 
     results = eval(tmplate1 % s) 
    except SyntaxError: 
    try: 
     results = eval(tmplate2 %s) 
    except SyntaxError: 
     pass 
    return results 

... который я думаю, будет обрабатывать все, что не содержит как тройные одинарные и тройной двойные кавычки строки.

(Этот один угловой корпус отличается от моих требований).

Справедливость этого кода здесь на SO; Ярлык синтаксиса, похоже, путается тем фактом, что моя docstring - это строка raw. Это было необходимо, чтобы сделать доктрину счастливой для этой конкретной функции).

5
import ConfigParser 

class MyConfigParser(ConfigParser.RawConfigParser): 
    def get(self, section, option): 
     val = ConfigParser.RawConfigParser.get(self, section, option) 
     return val.strip('"') 

if __name__ == "__main__": 
    #config = ConfigParser.RawConfigParser() 
    config = MyConfigParser() 

    config.read(["example.cfg"]) 
    print config.get('GENERAL', 'onekey') 
2

Вопрос довольно старый, но в 2.6 по крайней мере вам не нужно использовать кавычки, поскольку пробелы сохраняются.

from ConfigParser import RawConfigParser 
from StringIO import StringIO 

s = RawConfigParser() 
s.readfp(StringIO('[t]\na= 1 2 3')) 
s.get('t','a') 
> '1 2 3' 

Это не распространяется ни на ведущие, ни на конечные пробелы! Если вы хотите сохранить их, вам нужно будет заключить их в кавычки, как было предложено. Воздержитесь от использования ключевого слова eval, так как у вас будет огромная дыра в безопасности.

-2

В этой ситуации самым простым решением является «eval()».

Однако вы можете беспокоиться о безопасности.Но вы могли бы еще сделать это:

def literal_eval(node_or_string): 
    """ 
    Safely evaluate an expression node or a string containing a Python 
    expression. The string or node provided may only consist of the following 
    Python literal structures: strings, numbers, tuples, lists, dicts,booleans, 
    and None. 
    """ 

в качестве образца:

import ast 
config = ConfigParser() 
config.read(["example.cfg"]) 
print ast.literal_eval(config.get('GENERAL', 'onekey')) 
# value in some words 
Смежные вопросы