【问题标题】:Importing a 3-D list variable from a text file in Python从 Python 中的文本文件导入 3-D 列表变量
【发布时间】:2012-09-04 16:24:38
【问题描述】:

我需要知道是否可以通过文本文件中的声明轻松地在脚本中分配变量。基本上,我希望用户能够通过文本文件更改变量以匹配所需的数字,而不必摆弄源代码。

文本文件输入格式:

faultInfo = [
             [["L1603",1,5],[271585,972739],[272739,872739, 272739,972739, 271585,972739, 271585,272389, 270999,272389]],
             [["L1605",1,5],[271897,872739],[272739,872739, 272739,972739, 271891,872739, 271891,272119, 270963,272119]],
             [["L1607",1,4],[271584,272738],[271584,272738, 271584,272388, 270998,272388, 270998,272386]]
            ]

我只是想将它加载到我的脚本中具有相同名称的列表变量中。我是 Python 新手,不是 CS 专业或其他任何专业。我知道我可以使用循环和诸如此类的方式加载 3-D 列表,但似乎应该有一种快速的方法来做到这一点,因为第 k 维的大小是锯齿状的,并且会因情况而异。

提前致谢。

谢谢

【问题讨论】:

    标签: python list variables import


    【解决方案1】:

    这些数据看起来很简单,您可以使用json.loadsast.literal_eval(均在标准库中)对其进行解析:

    >>> a = """[
    ...              [["L1603",1,5],[271585,972739],[272739,872739, 272739,972739, 271585,972739, 271585,272389, 270999,272389]],
    ...              [["L1605",1,5],[271897,872739],[272739,872739, 272739,972739, 271891,872739, 271891,272119, 270963,272119]],
    ...              [["L1607",1,4],[271584,272738],[271584,272738, 271584,272388, 270998,272388, 270998,272386]]
    ...             ]
    ... 
    ... """
    >>> import ast
    >>> ast.literal_eval(a)
    [[['L1603', 1, 5], [271585, 972739], [272739, 872739, 272739, 972739, 271585, 972739, 271585, 272389, 270999, 272389]], [['L1605', 1, 5], [271897, 872739], [272739, 872739, 272739, 972739, 271891, 872739, 271891, 272119, 270963, 272119]], [['L1607', 1, 4], [271584, 272738], [271584, 272738, 271584, 272388, 270998, 272388, 270998, 272386]]]
    >>> import json
    >>> json.loads(a)
    [[[u'L1603', 1, 5], [271585, 972739], [272739, 872739, 272739, 972739, 271585, 972739, 271585, 272389, 270999, 272389]], [[u'L1605', 1, 5], [271897, 872739], [272739, 872739, 272739, 972739, 271891, 872739, 271891, 272119, 270963, 272119]], [[u'L1607', 1, 4], [271584, 272738], [271584, 272738, 271584, 272388, 270998, 272388, 270998, 272386]]]
    

    您可以从file.read() 轻松获取字符串(在我的示例中为a

    【讨论】:

    • 这是我一直在寻找的,除了一些神奇的直接 1 对 1。谢谢!
    【解决方案2】:

    你可以创建一个单独的 .py 文件,比如configuration.py amd 把这个变量放到这个文件中。如果用户想改变这个变量中的数字,他或她只需要通过简单的文本编辑器打开这个文件并更正faultInfo声明。

    【讨论】:

    • 是的,这将是我最后的选择。但是,我计划对这个程序进行相当多的扩展,基本上希望所有必要的数据都集中到一个文本文件中以便于使用。
    【解决方案3】:

    如果省略赋值,则使用eval() 函数是一种快速而肮脏的方法。例如,如果您的文件 param.txt 是:

     [
         [["L1603",1,5],[271585,972739],[272739,872739, 272739,972739, 271585,972739, 271585,272389, 270999,272389]],
         [["L1605",1,5],[271897,872739],[272739,872739, 272739,972739, 271891,872739, 271891,272119, 270963,272119]],
         [["L1607",1,4],[271584,272738],[271584,272738, 271584,272388, 270998,272388, 270998,272386]]
     ]
    

    加载它的一种简单方法(正如我所说的脏)是:

    with open('param.txt') as f:
        file_text = ' '.join(f.readlines()) #Join lines with a blank ' ' space
    parameter = eval(file_text)
    

    【讨论】:

    • 谢谢,这很有趣。我对 python 了解得越多,我就越喜欢它。
    • @scorpiknox 对eval 非常小心,有人可能会在您的文件中写入"os.system('rm -rf /')",这可能非常糟糕;)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2020-12-22
    • 2021-04-14
    • 2019-06-13
    相关资源
    最近更新 更多