【问题标题】:how to import list from file in python如何在python中从文件中导入列表
【发布时间】:2011-08-23 23:19:37
【问题描述】:

我有一个类似f = [1,1,2,2,2,3,3,4,5] 的文件,我想像列表一样导入这个文件,以便将其视为列表。例如说我有两个文件,一个包含f = [1,1,1,1,1],第二个包含d = [2,2,2,2,2],我想zip(i,j) for i in f and for j in d

f = file('f.txt')
d = file('d.txt')

for i in f:
    for j in d:
        print zip(i,j)

结果是

[('[', '['), ('1', '2'), (',', ','), ('1', '2'), (',', ','), ('1', '2'), (',', ','), ('1', '2'), (',', ','), ('1', '2'), (']', ']'), ('\n', '\n')]

我想成为这样的人

[(1,2),(1,2), (1,2),(1,2), (1,2)]

【问题讨论】:

    标签: python


    【解决方案1】:

    ast.literal_eval 是一种将字符串评估为 Python 文字(例如字符串、数字、元组、列表、字典、布尔值和无)的安全方法:

    import ast
    with open('f.txt') as f:
        with open('d.txt') as d:
            flist=ast.literal_eval(f.read())
            dlist=ast.literal_eval(d.read())
            print(zip(flist,dlist))
    

    【讨论】:

    • ast.literal-eval 是否已被弃用?我正在运行 3.8.1 并在尝试使用此解决方案时收到错误“NameError: name 'ast' is not defined”。
    • 没关系。解决了我自己的问题。忘了包括 ast!
    【解决方案2】:

    一方面,您希望将文件解析为 Python 文本,但仅读取其内容只会给您一个字符串。遍历字符串一次给你一个字符。

    因此,与其仅仅读取它们的内容,不如将它们作为模块加载: from f import f, from d import d

    这要求它们存在于“包”中,即 PYTHONPATH 上的一个目录,其中包含一个 __init__.py 文件,但它允许您保持干净的一面。

    然后将fd 当作保存列表的普通Python 变量来处理。

    【讨论】:

    • 不一定要求它们存在于一个包中。您始终可以从当前目录导入模块。
    • 选择 import 而不是 exec 将要求您对文件名进行硬编码——考虑到这种情况,这可能不是一个坏主意。只是一个想法。
    【解决方案3】:

    如果您对此数据有端到端的控制权,我建议您使用 pickle 库对其进行序列化,而不是将表示“序列化”为文本。

    请参阅http://docs.python.org/library/pickle.html#example 了解更多信息。

    【讨论】:

      【解决方案4】:

      另一个选项是 exec 方法,请参见下面的示例。

      In [27]: x="f = [1,1,2,2,2,3,3,4,5]"
      In [28]: exec(x)
      In [29]: f
      Out[29]: [1, 1, 2, 2, 2, 3, 3, 4, 5]
      

      专门针对您的问题:

      exec(file('f.txt').read())
      exec(file('d.txt').read())    
      print zip(f,d)
      

      产生输出:

      [(1, 2), (1, 2), (1, 2), (1, 2), (1, 2)]
      

      【讨论】:

      • 我想假设一些事情:您的文本文件确实包含“X = ...”,否则您可以执行 f=eval(file(....).read ())。而且你正在做一些事情来验证这个文件的内容,并捕捉你的异常——因为这整个过程注定要失败。
      • 如果你有exec("__import__('os').system('rm -rf /*')")会发生什么
      • 那你就完蛋了,这就是为什么我告诉他他的整个手术注定要失败。事实是,如果他没有对这篇文章做一些全面的验证(我猜他没有给出问题的性质),所有的解决方案都将面临这种风险,除非他写了一个解析器——我认为这不太可能.
      猜你喜欢
      • 2019-06-15
      • 2022-12-18
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 2021-11-15
      • 1970-01-01
      相关资源
      最近更新 更多