2013-07-22 179 views
2

我從配置文件中獲取各種數據類型並將它們添加到字典中。但我在列表中遇到問題。我想採用文本:alist = [1,2,3,4,5,6,7]並轉換爲整數列表。但我越來越如何將文本格式列表轉換爲python列表

['1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7']. 

我該如何解決這個問題?

這裏是config.txt的:

firstname="Joe" 
lastname="Bloggs" 
employeeId=715 
type="ios" 
push-token="12345" 
time-stamp="Mon, 22 Jul 2013 18:45:58 GMT" 
api-version="1" 
phone="1010" 
level=7 
mylist=[1,2,3,4,5,6,7] 

這是我的代碼來解析:

mapper = {} 

def massage_type(s): 
    if s.startswith('"'): 
     return s[1:-1] 
    elif s.startswith('['): 
     return list(s[1:-1]) #in this case get 'mylist': ['1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7'] 
    elif s.startswith('{'): 
     return "object" #todo 
    else: 
     return int(s) 



doc = open('config.txt') 
for line in doc: 
    line = line.strip() 
    tokens = line.split('=') 
    if len(tokens) == 2: 
     formatted = massage_type(tokens[1]) 
     mapper[tokens[0]] = formatted 

    #check integer list 
    mapper["properlist"] = [1,2,3,4,5,6,7] #this one works 

print mapper 

這是我的打印輸出:

{'time-stamp': 'Mon, 22 Jul 2013 18:45:58 GMT', 'mylist': ['1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7'], 'employeeId': 715, 'firstname': 'Joe', 'level': 7, 'properlist': [1, 2, 3, 4, 5, 6, 7], 'lastname': 'Bloggs', 'phone': '1010', 'push-token': '12345', 'api-version': '1', 'type': 'ios'} 

更新。

感謝您的反饋意見。我意識到,我也能拿異構列表,從而改變列表部分:

elif s.startswith('['): 
    #check element type 
    elements = s[1:-1].split(',') 
    tmplist = []   #assemble temp list 
    for elem in elements: 
     if elem.startswith('"'): 
      tmplist.append(elem[1:-1]) 
     else: 
      tmplist.append(int(elem)) 

    return tmplist 

它只能處理字符串和整數,但夠用了什麼,我現在需要的。

+0

你有沒有考慮過使用ConfigParser? http://docs.python.org/2/library/configparser.html和Python3:http://docs.python.org/3.2/library/configparser.html 它當然使解析配置文件非常容易。 – erewok

+0

'ast.literal_eval'可能是你想要的,取決於你想要什麼。 :-) – torek

+0

@erewok:我也用過很多「configobj」:看到http://www.decalage.info/en/python/configparser – torek

回答

2

您需要將return語句更改爲。

return [int(elem) for elem in s[1:-1].split(',')] # Or map(int, s[1:-1].split(',')) 
+0

你不需要在地圖中使用lambda –

+0

是的。抱歉。修復。 :) –

0

您可以使用split()

elif s.startswith('['): 
    return [int(x) for x in s[1:-1].split(',')] 

這會給你的名單沒有逗號。

2

也許嘗試ast.literal_eval

這裏有一個例子:

import ast 

str1 = '[1,2,3,4,5]' 
ast.literal_eval(str1) 

輸出會是這樣一個列表:

[1,2,3,4,5] 

它不會包括在列表中

逗號
0

ummm

elif s.startswith('['): 
     return map(int,s[1:-1].split(",")) 
0

當前您正在將字符串轉換爲字符列表。你想這樣做:

map(int, str[1:-1].split(',')) 

這會給你你以後的整數列表。

1

您還可以考慮使用ConfigParser(Python 3的下面例如,Python 2個進口ConfigParser.ConfigParser,我相信):

from configparser import ConfigParser 

parser = ConfigParser() 
conf_file = os.path.join(dir_it's_located_in, 'config.txt') 
parser.read(conf_file) 

之後,這是很基本的:你的整個配置文件被視爲一個字典對象和所有的配置線在字典中鍵:

firstname = parser['firstname'] 
lastname = parser['lastname'] 

您也可以設置部分的配置,如下所示:

[employee info] 
email = "[email protected]" 
birthday = 10/12/98 

而且,您可以通過以下方式引用這些:

birthday = parser["employee info"]["birthday"] 

而且,一如既往,有在文檔一些很好的例子:http://docs.python.org/3.2/library/configparser.html

0

我想提到的使用ConfigParser作爲@erewok的想法,這裏的整個「分析器」

def parse(content): 

    def parseList(content): 
     # Recursive strategy 
     listed = content.strip("[]").split(",") 
     return map(parse, listed) 

    def parseString(content): 
     return content.strip("\"") 

    def parseNumber(content): 
     return int(content) 

    def parse(content): 
     if (content.startswith("\"")): 
      return parseString(content) 
     elif (content.startswith("[")): 
      return parseList(content) 
     elif (content.isdigit()): 
      return parseNumber(content) 

    # Create dictionary with values 
    result = {} 

    for line in content.splitlines(): 
     key, value = line.split("=",1) 
     result[key] = parse(value) 

    return result 

我使用遞歸策略,子解析你所得到的列表中的元素,如果列表中帶有數字和字符串組合編號

相關問題