2016-02-29 183 views
0

我正在開發一個具有貨幣系統的Twitch Python IRC Bot。用戶的餘額存儲在列表中,該列表從文本文件中加載並保存。但是,由於文本文件的內容正在加載到一個單獨的字符串中,然後將其放入列表中,所以我無法遍歷字符串中的每個條目以添加點。例如,這裏是我正在尋找的迭代列表:[10, 21, 42, 5]Python - 將字符串轉換爲可重用的整數列表

但是,當這被保存到一個文本文件,然後加載到列表中,結果是這樣的:['10, 21, 42, 5', '0'(添加了0條目)。正如你所看到的,這將遍歷整個列表,只識別2個部分,這就是引用的地方。有沒有一種方法可以將從文本文件中提取的字符串轉換爲我可以迭代的整數的列表?提前致謝!

+1

你是如何保存到文本文件,你怎麼裝呢? –

+0

考慮類似於使用'json'序列化的字典。 'dict'鍵可以是用戶標識符,值可以是餘額。 –

+0

如果您的郵政編碼(以最簡單的方式),您可能會得到更好的答案。 –

回答

0

免責聲明:

所有其他的答案是非常良好做法好的建議用於存儲數據,並在以後的閱讀他們,但既然你特別問到如何「的字符串轉換來自取出將文本文件整理成一個整數列表......「,我很樂意幫助完成這樣的事情。

然而,雖然這個答案可能是適合你的要求做了具體的東西,它絕不是最佳實踐達到你想要的(在整數列表保存,這將是更好做過什麼與JSON或YAML)。


SOLUTION

好吧,這似乎相當簡單。

您有原始的列表[10, 21, 42, 5]

你將它保存到一個文本文件,然後讀取它作爲一個清單才發現有兩個部分(和他們回饋字符串+什麼是額外0?!):

['10, 21, 42, 5', '0']

好像你只需要在第一部分中,所以:

>>> x = ['10, 21, 42, 5', '0'] 
>>> y = x[0] 
>>> print(y) 
'10, 21, 42, 5' 
>>> print(type(y)) 
str 

別急,返回一個字符串!很簡單,只是通過分離", "分裂:

>>> z = y.split(", ") 
>>> print(z) 
['10', '21', '42', '5'] 

現在,它返回一個列表,但它仍然是一個字符串列表,所以我們要做的就是名單中的每個元素轉換成類型int(整數)。這是很容易與標準for循環做的,但我們可以做這一個班輪與map功能:

... 
>>> print(z) 
['10', '21', '42', '5'] 
>>> z = map(int, z) # apply int() to every elem; equi. to [int('10'), int('21'), int('42'), int('5')] 
>>> print(z) 
[10, 21, 42, 5] 
>>> print(map(type, z)) # print out type of every element in list 
[int, int, int, int] 

結論

因此,考慮的讀入名單離奇的字符串x = ['10, 42, 21, 5', '0'],你可以得到你想要的與整數的列表:

z = map(int, x[0].split(", ")) 
0

當您將保存爲該文件時,您需要乾淨地這樣做 - 確保您以一致的格式編寫。

當您從文件中讀取數據時,我建議使用ast包中的literal_eval。這會將文件中包含的任何字符串轉換爲Python類型。

0

您是否嘗試將列表寫入yaml文件而不是文本文件?

import yaml 

myfile = path/to/my/file 
mylist = [10, 21, 42, 5] 

with open(myfile,'w') as handle: 
    yaml.dump(mylist, handle, default_flow_style=False) 

with open(myfile,'r') as handle: 
    retrieved_list = yaml.load(handle) 

print retrieved_list