【问题标题】:Move list from iPython cell into datafile将列表从 iPython 单元格移动到数据文件中
【发布时间】:2016-02-14 00:47:30
【问题描述】:

我有以下数据,当前存储在 Python 列表中:

formant_data = [ 
    'ɑ',  
     125, 150, 10,
     580,  50, 10,
     780,  50,  9,
    1010,  50, 10,
    2530, 100,  9,
    4400, 150,  8,
    5300, 200,  8,
    5880, 200,  7,
    7420, 200,  7,
    8860, 200,  7,

    'a',
     168, 120, 10,
     680,  50,  9,
    1000,  50,  9,
    1500, 150,  8,
    2500, 200,  7,
    5200, 800,  7,
    7200, 400,  6,
    8500, 400,  6,

    'ɛ',
     150, 120, 10,
     700,  50,  8,
     750,  50,  8,
    1800, 150,  8,
]

我将其解包如下:

import numpy as np

vowels = deque()
acc = deque()
for x in reversed(formant_data):
    if isinstance(x,str):
        symbol = x
        print(symbol)
        data = np.reshape( acc, (-1,3) )
        vowels.appendleft(data)
        acc.clear()
    else:
        acc.appendleft(x)
return vowels

我希望将数据移动到文本文件中,然后读入。

最简单的方法是什么?

我不介意摆弄数据文件格式。主要目标是易于阅读。

编辑:也许我可以将其保存为 data.pyimport data.py ?问题:我希望它驻留在input/data.py

编辑:%run 魔法?

【问题讨论】:

    标签: python list file csv ipython


    【解决方案1】:

    为了比importexec 更好的安全性,同时保持可读性,使用标准的json 模块:

    保存:

    import json
    with open( filename, 'wt' ) as datafile:
        json.dump( formant_data, datafile, indent=3 )
    

    加载:

    import json
    with open( filename, 'rt' ) as datafile:
        formant_data = json.load( datafile )
    

    这使您可以灵活地决定如何格式化数据。 json 序列化支持 dict 类型,这可能是一种将数字与每个音素相关联的更自然的方式。

    【讨论】:

    • 删除了基于 pickle 的替代代码,因为 pickle 也不安全。
    【解决方案2】:

    选项 1:(类似于您的 EDIT 选项)

    您可以简单地将您的列表存储在一个名为data_file.py 的文件中,然后执行from data_file import *

    选项 2:(由 cmets 中的 jez 提供)

    更高效,但有点难以理解。您可以简单地将您的列表存储在一个名为 data_file.py 的文件中,然后在您的代码中执行:

    container = {}
    exec(open('data_file.py').read(), container)
    

    选项 3:

    您可以将列表中的所有内容存储在一个.txt或.whatever文件中,然后读取该文件的所有内容并用“,”分割,如下:

    with open('input.txt', 'r') as input:
        content = input.read()
        list = content.split(',')
    

    然后你就可以对你的列表做任何你想做的事情了。

    【讨论】:

    • execfile代替import。如果您想控制变量的最终位置,请说container = {}; execfile(filename, container)。首选execfile 而不是import 的原因是,一旦您导入data.py 一次,其内容将被缓存,并且后续导入同一文件将产生旧数据,而不管最近的更改如何。使用importexecfile,请注意安全隐患,因为您允许解释器执行写在可能是或可能不是良性“数据”文件中的任意命令。
    • 你是对的,但execfile 并非对所有python版本都有效
    • Argh stackoverflow.com/questions/436198/… 为什么是 Python WHY?
    【解决方案3】:

    很抱歉在问题中添加了 iPython——我认为这无关紧要,但事实证明 iPython 有一个 %run 魔法:

    %run input/formant_data.py
    

    虽然我会这样做,但我很感激其他答案。我认为import 需要packaging,因为该文件不在当前文件夹中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多