我正在开发一款具有货币系统的Twitch Python IRC Bot。用户的余额存储在列表中,该列表从文本文件加载并保存到文本文件中。但是,因为文本文件的内容被加载到一个单个字符串中,然后放在列表中,我无法遍历字符串中的每个条目以向其添加点。例如,这是我正在寻找的可迭代列表:$qty_of_leads_by_levels = array();
$avg_conv_cof_arry = array();
$avg_deal_size = 0;
$total_bgt = 0;
for($i=0;$i<count($arr1);$i++){
foreach($arr1[$i]['qty_of_leads_by_levels'] as $k=>$v){
$qty_of_leads_by_levels[$k] += $v;
}
foreach($arr1[$i]['avg_conv_cof_arry'] as $k1=>$v1){
$avg_conv_cof_arry[$k1] = $avg_conv_cof_arry[$k1] + $v1;
}
$avg_deal_size += $arr1[$i]['avg_deal_size'];
$total_bgt += $arr1[$i]['total_bgt'];
}
但是,当它保存到文本文件然后加载到列表中时,结果如下:[10, 21, 42, 5]
(添加了0条目)。正如您所看到的,这将遍历列表,只识别2个部分,这是引号所在的位置。有没有办法可以将从文本文件中提取的字符串转换为可以迭代的整数列表?提前谢谢!
答案 0 :(得分:1)
当您将保存到文件时,您希望干净利落地完成此操作 - 确保以一致的格式书写。
当您从文件中读取内容时,我建议您使用literal_eval
包中的ast
。这会将文件中包含的任何字符串转换为Python类型。
答案 1 :(得分:1)
您是否尝试将列表写入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
答案 2 :(得分:1)
所有其他答案非常关于存储数据和稍后阅读它们的良好实践的良好建议,但是因为您特别询问如何“将从文本文件中获取的字符串转换为整数列表......“,我很乐意帮助完成这样的事情。
然而,虽然这个答案可能适合您要求完成的确切事情,但它绝不是最佳实践来实现您想要的(保存在整数列表中,这将是用JSON或YAML做得更好。
好的,这看起来很简单。
您有一份原始列表[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(", "))