2013-07-23 2 views
0

У меня есть файл с определенной функцией, которая импортирует и упорядочивает данные в список списков. Он возвращает этот список списков, и все эти функции прекрасно работают в одном файле (если я пишу основную функцию и вызываю функцию импорта, никаких проблем).Передача списка из импортированного модуля

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, независимо от того, насколько просто. У кого-нибудь еще была эта проблема?

+1

Нет, это не так, как работает Python. Пожалуйста, покажите нам больше кода; что-то еще не так. Если вы не возвращаете 'None' явно, также может быть, что ваша функция заканчивается без явного' return' * на всех *, а это означает, что по умолчанию возвращается 'None'. –

+0

Функция import_viscosity_data длинна, но будьте уверены, что она вернет правильный список списков. Например, если я поставил проблему вызовом функции, используя IDE, в файле load_files, вот так: 'test = import_viscosity_data (7)' работает отлично. Но когда я вызываю вызов из другого файла, вот так: 'new_list = load_files.import_viscosity_data (7)' он возвращает None. –

+0

Но ваша функция возвращает 'None'. * Это указывает на ошибку в вашем коде *. Мы не можем помочь вам отладить это, не увидев ваш код. –

ответ

0

Проблема была в заявлении импорта файла test.py. Сначала я путал проблему, имея в том же каталоге, что и 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 высказал ошибку, что модуль не существует. В любом случае, теперь все работает хорошо с вышеуказанным кодом.

Особая благодарность Martijn Pieters за отзыв.

Смежные вопросы