我有一个定义了函数的文件,它将数据导入并组织到列表列表中。它返回列表列表,这一切都在同一个文件中正常运行(如果我编写一个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。有没有人有这个问题?
答案 0 :(得分:0)
问题是test.py
文件的import语句。起初,我在与test.py
,load_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.py
和load_files.py
,没有子目录,我无法正常工作) )。 import load_files
的import语句引发了模块不存在的错误。无论如何,现在使用上面的代码一切都很好。
特别感谢Martijn Pieters的反馈。