У меня есть файл с определенной функцией, которая импортирует и упорядочивает данные в список списков. Он возвращает этот список списков, и все эти функции прекрасно работают в одном файле (если я пишу основную функцию и вызываю функцию импорта, никаких проблем).Передача списка из импортированного модуля
def import_viscosity_data(size_of_header):
...
return (list_of_lists)
Я пытаюсь вызвать эту функцию из другого файла в том же каталоге, используя следующие:
import load_files
print(load_files.import_viscosity_data(7))
К сожалению, это ведет не возвращаются «Нет», и если я пытаюсь получить длина возвращаемого массива, он выдает ошибку: 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, не вызывая никаких ошибок. Имя функции автоматически появляется в среде 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, независимо от того, насколько просто. У кого-нибудь еще была эта проблема?
Нет, это не так, как работает Python. Пожалуйста, покажите нам больше кода; что-то еще не так. Если вы не возвращаете 'None' явно, также может быть, что ваша функция заканчивается без явного' return' * на всех *, а это означает, что по умолчанию возвращается 'None'. –
Функция import_viscosity_data длинна, но будьте уверены, что она вернет правильный список списков. Например, если я поставил проблему вызовом функции, используя IDE, в файле load_files, вот так: 'test = import_viscosity_data (7)' работает отлично. Но когда я вызываю вызов из другого файла, вот так: 'new_list = load_files.import_viscosity_data (7)' он возвращает None. –
Но ваша функция возвращает 'None'. * Это указывает на ошибку в вашем коде *. Мы не можем помочь вам отладить это, не увидев ваш код. –