从文本文件中识别列表

时间:2016-04-07 19:07:00

标签: python csv python-3.x

我有一个文本文件“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)

但是直接从文本文件中读取是不方便的(按人)。

4 个答案:

答案 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)