2016-02-29 65 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 
相关问题