我有一个文本文件“blah.txt”,其中包含以下数据:
blah1:[01,02,03]
blah2:[01,02,03]
我可以阅读该文件并将其放入列表中:
reader = csv.reader(open('blah.txt'),delimiter=":")
但[01,02,03]不会被识别为列表,而是字符串。是否有简短的方法来将其识别为列表?
完整代码:
import csv, operator
reader = csv.reader(open('file.txt'),delimiter=":")
sortedlist = sorted(reader, reverse=True)
for name, score in sortedlist:
print(score)
修改
我可以将数据写为
blah1:010203
blah2:010203
并使用此:
import csv, operator
reader = csv.reader(open('file.txt'),delimiter=":")
sortedlist = sorted(reader, reverse=True)
for name, score in sortedlist:
score = [int(score[i:i+2]) for i in range(0, len(score), 2)]
print(name, score)
但是直接从文本文件中读取是不方便的(按人)。
答案 0 :(得分:1)
起初我认为ast.literal_eval
是正确的工具,但看看会发生什么:
>>> literal_eval('[01,020,03]')
[1, 16, 3]
由于您可能不希望以0开头的整数在基数8中进行解释,因此我认为没有比用逗号分割更漂亮的解决方案:
>>> s = '[01,020,03]'
>>> [int(x) for x in s[1:-1].split(',')]
[1, 20, 3]
如果您有机会在不向文件前导零的情况下编写整数,ast.literal_eval
将再次获胜。
答案 1 :(得分:0)
假设您将"[01,02,03]"
存储为字符串变量s
。然后你可以这样做:
score = [int(x) for x in s.strip('[').strip(']').split(',')]
只要括号之间没有空格。
答案 2 :(得分:0)
输入(line.txt):
blah1: [01,02,03]
blah2: [01,02,03]
blah3: [01,02,03]
blah4: [01,02,03]
处理文件:
from collections import OrderedDict # if you want to maintain the order
data = OrderedDict()
for line in open("list.txt").readlines():
k, v = line.split(':')
# from list (in string form), remove whitespace, remove brackets
# turn the list (in string form) into a list
data[k] = v.strip()[1:-1].split(',')
结果:
>>> data
OrderedDict([('blah1', ['01', '02', '03']), ('blah2', ['01', '02', '03']),
('blah3', ['01', '02', '03']), ('blah4', ['01', '02', '03'])])
答案 3 :(得分:0)
这就是我最终使用的内容,感谢@timgeb的建议。
reader = csv.reader(open(file + '.txt'),delimiter=":")
data = {}
for name, score in reader:
data[name] = sorted(ast.literal_eval(score), reverse=True)