在多个python模块中使用相同的数组

时间:2014-01-22 13:00:43

标签: python arrays numpy

我是python和编程的新手。我试过搜索这个,但一直找不到答案。

我正在寻找将数据文件附加到数组的最佳方法,并在多个python模块中使用它。作为一个学期的理科学生,我知道在我的教育期间我会多次使用这个,所以我想要一些帮助,找到一个更好的方法来做到这一点。

以下是我第一学期团体项目的一个例子。我们被要求使用python模拟演讲者,以帮助完成不同的任务。我们被给予阻塞读取以在数据文件中使用。数据文件有3个collumns。频率,实阻抗,虚阻抗。

在第一个文件中,我们称之为import_define.py。我们有以下代码,从名为data的数据文件中导入。

infile = open('data.dat', 'r')
infile.readline()

freq_list = []
real_list = []
imag_list = []

for line in infile:
    split = line.split()
    freq_list.append(float(split[0][:-1]))
    real_list.append(float(split[1][:-1]))
    imag_list.append(float(split[2]))
infile.close()

import numpy as np

freqenzy = np.asarray(freq_list)
real_imp = np.asarray(real_list)
imag_imp = np.asarray(imag_list)

然后我们在这个模块中使用了三个数组进行不同的计算。

现在我们要在不同的模块plot.py中使用这些数组,我们要在这些模块中绘制来自这3个数组的一些数据,以及在import_define.py中计算的不同数据

我们所做的是在import_define.py中定义3个返回数组的函数,如下所示:

def freq_func():
    return frequenzy

def real_imp_func():
    return real_imp

def imag_imp_func():
    return imag_imp

在plot.py文件中,我们执行了以下操作来导入和使用此新模块中的数组:

import import_define as imd

freq = imd.freq_func()
real = imd.real_imp_func()
imag = imd.imag_imp_func()

所以我想问一下,当使用python时,是否有更好或更正确的方法。

4 个答案:

答案 0 :(得分:1)

数组变量是import_define模块中的全局变量,因此您可以直接使用它们:

import import_define as imd
print imd.frequenzy

我认为您可以使用numpy.loadtxt快速加载文件中的数组,而不是for循环。

答案 1 :(得分:0)

无需拥有这些功能。在plot.py中,您可以使用以下命令访问这些变量:

import import_define as id

id.freqenzy

答案 2 :(得分:0)

您可以实现单例模式。

class ModuleSharedFile:

    class __SharedFile:
        def __init__(self, file_path):
            self.file_path = file_path
            self.array = self.__loadArray()
        def __str__(self):
            return repr(self) + self.val
        def __loadArray(self):
            # Do your stuff here.
            pass

    instance = None

    def __init__(self, file_path):
        if not ModuleSharedFile.instance:
            ModuleSharedFile.instance = ModuleSharedFile.__SharedFile(file_path)
        else:
            ModuleSharedFile.instance.file_path = file_path

    def __getattr__(self, name):
        return getattr(self.instance, name)

然后,无论您在哪里创建ModuleSharedFile的实例,您都将使用相同的文件/数组。

答案 3 :(得分:0)

最简单的解决方案描述于:“如何跨模块共享全局变量?”:http://effbot.org/pyfaq/how-do-i-share-global-variables-across-modules.htm

  

因为每个模块只有一个实例,所以对模块对象所做的任何更改都会反映在任何地方。

因此python模块的实例是单例。

您创建空文件dummy.py,它将被初始化为模块。

# module1.py
import dummy
dummy.x = "value"  # set shared value

# module2.py
import dummy
print dummy.x      # read shared value