【问题标题】:converting part of a text file to list将部分文本文件转换为列表
【发布时间】:2014-03-04 03:11:12
【问题描述】:

我有一个制表符分隔的电影和演员文本文件。条目格式如下:

The Shawshank Redemption    ["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"]

The Dark Knight ["Christian Bale", "Heath Ledger", "Aaron Eckhart", "Michael Caine"]

有没有一种简单的方法让 python 将演员“列表”视为 python 列表数据结构,而不是带有 [] 字符的字符串?我尝试编写代码以从[ 字符开始对字符串进行切片,使用.strip().rstrip() 剥离[]",然后使用.split(' ,') 制作一个列出剩余的字符串。但这并没有返回我想要的结果。

【问题讨论】:

    标签: python list tsv


    【解决方案1】:

    使用ast.literal_eval,python 的eval() 函数的safer 版本,它接受字符串输入并将其视为python 代码。假设总是有一个制表位,您可以使用制表符拆分'\t',只需评估第二个元素:

    import ast
    for line in f.readlines():
        temp_list = ast.literal_eval(line.split('/t')[1])
        # do something
    

    只是一个细分,以您的第一行为例:

    >>> first_line = "The Shawshank Redemption    ["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"]"
    >>> split_line = first_line.split('/t')
    >>> split_line
    ['The Shawshank Redemption', '["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"]']
    >>> best_list_ever = ast.literal_eval(split_line[1])
    >>> best_list_ever
    ["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"]
    

    【讨论】:

    • 我不熟悉eval()函数,为什么这样更安全?
    • @Mike 查看链接。简而言之,eval 绝对会评估任何内容,包括 os.system('rm -rf /') (DON'T DO THIS),它会从字面上开始删除所有文件。当然,在本地保存在计算机上的小型 python 脚本上,发生这种情况的可能性不大,但无论如何使用literal_eval 是一种很好的编程习惯。两者的唯一区别是literal_eval 只会评估有效的python 数据结构。
    • 感谢您的澄清,在阅读了这些文档之后,它非常有意义。另外,我的新默认列表变量已正式成为“best_list_ever”
    • @Mike 虽然效率不高,但绝对时尚。
    猜你喜欢
    • 2013-06-12
    • 2023-03-10
    • 2016-04-14
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多