0

我有一个定义了函数的文件,它将数据导入并组织到列表列表中。它返回该列表列表,并且所有函数在同一个文件中都很好(如果我编写一个主函数并调用导入函数,没有问题)。

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)

这里有一些示例数据可供试用(两列中的任何数据,中间有一个制表符):

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,而不会引发任何错误。函数名称在 IDE 之后会自动弹出import load_files,因此它似乎可以正确导入。

注意 *此次要问题已解决。该文件load_files.py位于名为load_files. 导入语句已更改为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。其他人有这个问题吗?

4

1 回答 1

0

问题是test.py文件的导入语句。起初,我混淆了这个问题,因为在与 相同的目录中test.pyload_files.py还有一个名为 的目录load_files,其中包含load_files.py一个名为__init__.py.

原来的剧本读

import load_files
print(load_files.import_viscosity_data(7))

我消除了load_files.pytest.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语句import load_files抛出了模块不存在的错误。无论如何,现在使用上面的代码一切正常。

特别感谢 Martijn Pieters 的反馈。

于 2013-07-25T19:16:08.563 回答