从导入的模块传递列表

时间:2013-07-23 20:47:48

标签: python list module scipy python-import

我有一个定义了函数的文件,它将数据导入并组织到列表列表中。它返回列表列表,这一切都在同一个文件中正常运行(如果我编写一个main函数并调用import函数,没问题)。

def import_viscosity_data(size_of_header):
    ...
    return (list_of_lists)

我正在尝试使用以下内容从同一目录中的另一个文件调用此函数:

import load_files
print(load_files.import_viscosity_data(7))

不幸的是,这会继续返回'None',如果我尝试获取返回数组的长度,则会抛出错误:TypeError:类型为'NoneType'的对象没有len()

我猜它传给了我对列表的引用,一旦函数终止,实际列表就会被删除,但我不知道如何解决这个问题。任何帮助将不胜感激!

以下是代码:

import os
import tkinter
from tkinter import filedialog
#import decimal
from decimal import *

def import_viscosity_data(size_of_header):
    ### This function imports viscosity data from multiple files, skipping the 
    ### header passed inof the form shearRate '\t' viscosity and puts it into 
    ### an array of the form test_num[result_type[data]]] where result type 
    ### is 0 (shearRate) or 1 (viscosity)

    header_size = size_of_header

    root = tkinter.Tk()
    root.withdraw()

    file_path = root.tk.splitlist(filedialog.askopenfilenames(
        parent=root, title='Choose a file(s):'))

    test_num = []
    result_type = []
    data_1 = []
    data_2 = []

    for file_name in file_path:

        f = open(file_name)

        ## Skip the header, which consists of header_size lines
        for i in range(header_size):
            next(f)

        lines = [line.strip() for line in f]
        f.close()


        ## For a line, slice all characters before the tab, then after the tab
        ## convert to Decimal, and append to the data list
        for index in range(len(lines)):
            data_1.append(Decimal(lines[index][0:lines[index].find('\t')]))
            data_2.append(Decimal(lines[index][lines[index].find('\t') + 1:]))

        result_type.append(data_1)
        result_type.append(data_2)

        test_num.append(result_type)
        data_1, data_2, result_type = [], [], []

    return(test_num)

以下是一些试用它的示例数据(2列中的任何数据,中间有一个标签):

0   1.2381
0.004   1.23901
0.008   1.23688
0.012   1.23734
0.016   1.23779
0.02    1.23901
0.024   1.23932
0.028   1.23886
0.032   1.23688
0.036   1.2384

同样,在这个程序中(在IDE中运行,或者如果我编写一个小的main()函数),这将返回一个列表列表,并且工作得很好。但是,当我在不同的文件中导入该函数时,它返回None,而不会抛出任何错误。函数名称在import load_files之后在IDE中自动弹出,因此它似乎正在正确导入。

注意的 *此次要问题已得到解决。文件load_files.py位于名为load_files的目录中。 import语句已更改为from load_files import load_files,现在它正常运行。*

今天我的问题变得更糟了。现在,我无法从第一个文件中获取任何函数在第二个文件中被识别。即使是一组简单的代码,如:

#load_files.py
def test_func():
    print('test successful')

#test.py
import load_files
load_files.test_func()

抛出此错误:

Traceback (most recent call last):
  File "C:\Users\tmulholland\Documents\Carreau - WLF\test.py", line 8, in <module>
    load_files.test_func
AttributeError: 'module' object has no attribute 'test_func'

load_files.py位于自己的文件夹(同名)中,文件空白__init__.py

注意我应该补充说我正在使用Pyzo IDE,因为我想使用scipy库来完成曲线拟合/优化问题。无论多么简单,我都无法将今天正确导入的任何函数导入Pyzo。有没有人有这个问题?

1 个答案:

答案 0 :(得分:0)

问题是test.py文件的import语句。起初,我在与test.pyload_files.py相同的目录中以及包含load_files的名为load_files.py的目录以及空白文件中混淆了该问题叫__init__.py

原始脚本阅读

import load_files
print(load_files.import_viscosity_data(7))

我删除了与load_files.py共享目录的test.py。现在,我在父目录中有test.py,然后是名为load_files的子目录,其中包含load_files.py。新脚本为:

from load_files import load_files
print(load_files.import_viscosity_data(7))

现在,列表列表被传递到本地空间,所以语句如

list_test = load_files.import_viscosity_data(7)

工作正常。

当我在同一目录中有两个.py文件时(例如同一目录中的test.pyload_files.py,没有子目录,我无法正常工作) )。 import load_files的import语句引发了模块不存在的错误。无论如何,现在使用上面的代码一切都很好。

特别感谢Martijn Pieters的反馈。