【问题标题】:Importing a function from one file to another gives me error将函数从一个文件导入另一个文件给我错误
【发布时间】:2019-08-16 13:41:02
【问题描述】:

我有 2 个文件。 一个叫file.py,另一个叫secondfile.py

file.py 我目前有代码:

def getTrain(data):
    trainList = []
    for list in data:
        for train in list['HorarioDetalhe']:
            trainDict = {}
            trainDict['id'] = train['ID']
            trainDict['origin'] = train['EstacaoOrigem']['Nome']
            trainDict['destiny'] = train['EstacaoDestino']['Nome']
            trainDict['operator'] = train['Operador']['Nome']
            trainDict['status'] = train['EstadoComboio']['Nome']
            trainDict['arrivalTime'] = train['HoraChegada']
            trainList.append(trainDict)
        getDelayedCSV(trainList)

def getDelayedCSV(trainList)
    file = open('delayedTrainsCSV.csv', 'w')
    file.close() #truncate
    header = False #removing headers
    word = 'Atrasado'
    for train in trainList:
       if word in train['status']:
          df = pd.DataFrame({'ID' : [train['id']],
                                'Origem' : train['origin'],
                                'Destino' : train['destiny'],
                                'Operador' : train['operator'],
                                'Estado' : train['status'],
                                'Chegada' : train['arrivalTime']})
         df.to_csv('delayedTrainsCSV.csv', index = False, mode='a', header = header)

现在我想在 secondfile.py 中使用 getDelayedCSV()secondfile.py 看起来像这样。

from file import *

def counter():
   data = list(getRequest())
   getTrain(data)
   getDelayedCSV(trainList)

但是当我执行 secondfile.py 时,它给了我一个错误NameError: name 'trainList' is not defined。 也许是因为我没有返回trainList,而是像这样调用函数getDelayedCSV(trainList)

【问题讨论】:

  • trainList 是函数getTrain 中的一个局部变量。因此,在该函数之外,您的脚本将看不到它。

标签: python python-3.x


【解决方案1】:

我不确定您为什么在 secondfile.py 中调用 getDelayedCSV(),因为它可能已经在调用 getTrain()。

但是,您收到错误的原因是 trainlist 仅存在于函数 getTrain 的范围内,一旦调用此函数,此列表将被垃圾收集并且将不再存在

一种解决方案是从 getTrain() 函数返回列表,如下所示:

def getTrain(data):
    trainList = []
    for list in data:
        for train in list['HorarioDetalhe']:
            trainDict = {}
            trainDict['id'] = train['ID']
            trainDict['origin'] = train['EstacaoOrigem']['Nome']
            trainDict['destiny'] = train['EstacaoDestino']['Nome']
            trainDict['operator'] = train['Operador']['Nome']
            trainDict['status'] = train['EstadoComboio']['Nome']
            trainDict['arrivalTime'] = train['HoraChegada']
            trainList.append(trainDict)
         getDelayedCSV(trainList)
    return trainList

然后您可以将其传递给 secondfile.py 中的 getDelayedCSV() 函数,如下所示:

from file import *

def counter():
    data = list(getRequest())
    trainList = getTrain(data)
    getDelayedCSV(trainList)

【讨论】:

  • 正在调用 getDelayedCSV(),因为它从 getTrain() 接收 trainList 的输出。有了它,但我怎样才能打印出 secondfile.py 中的 getDelayedCSV(trainList) 函数?
  • @BrunoTeixeira return getDelayedCSV 中的数据框,并在您在 getTrain 中调用该函数时添加打印语句
  • 它工作了@KartikeyaSharma,但无论如何我不想在 secondfile.py 上使用数据框,因为我只需要直到 if 中的语句b>getDelayed() 也许最好的办法是只做 secondfile.py 中的条件
【解决方案2】:

问题在于 trainList 变量未在 secondfile.py 中定义,仅作为第一个文件中 getTrain 函数的范围。此外,导入文件时不应使用file.py 作为名称,因为它是python 中的标准名称。你应该使用类似 firstfile.py 的东西

您应该在getTrain 函数中返回火车列表,然后

from file import *

def counter():
   data = list(getRequest())
   trainList=getTrain(data)
   getDelayedCSV(trainList)

【讨论】:

    【解决方案3】:

    是的,trainList只存在于getTrain函数的范围内,你必须返回它才能在counter中使用。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2018-05-02
      • 2021-06-21
      • 2017-08-03
      • 1970-01-01
      • 2017-10-22
      • 2021-09-09
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多