函数之外的Python访问变量

时间:2014-06-12 18:29:49

标签: python python-2.7 csv

提前感谢您查看@这个问题:

我尝试解析CSV文件,并返回某些字段的值。内联作为脚本时代码运行得很好,但是当我尝试创建一个可以被我的应用程序中的其他模块访问的函数时,我遇到的问题是我拉的变量(键/值)来自csv文件。

解析CSV的代码(parseCsv.py):

groups =[]
enterprise = []
workinglist = []

def parse_csv(filename):
  quote_char = '"'
  delimiter = ','
  csv_to_parse = open(filename, 'rb')
  csv_reader = csv.DictReader(csv_to_parse, fieldnames=[], restkey='undefined-fieldnames', delimiter=delimiter, quotechar=quote_char)
  current_row = 0
  for row in csv_reader:
    current_row +=1
    if current_row == 1:
      csv_reader.fieldnames = row['undefined-fieldnames']
      continue
    groups.append(row['groupid'])
    enterprise.append(row['enterprise'])
    workinglist.append(row)

我已尝试将global参数用于群组,企业和工作清单;并尝试添加return groups, return workinglist, return enterprise

无论语法如何,我都无法访问此函数之外的组,企业或工作列表变量。我需要在我的应用程序的其他部分操作这些结果。如果我在函数中添加print groups,它会正常运行,但是从函数外部我最终得到[].我也尝试将parse_csv作为类的方法,添加一个selfinit,但没有成功。

作为参考,我使用parse_csv(csvfilename)从另一个文件调用它。它导入文件并正确读取。

我确信这是一件非常简单而且非常快速的事情,我很遗憾,但是我已经盯着这么久,我无法看到它,任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:2)

您应该将列表作为参数传递给函数,以便可以修改它们。这是它的工作原理:

foo = []

def f(arg):
  arg.append(1)
  arg.append(2)

f(foo)
print foo # output: [1, 2]

这是有效的,因为列表是可变的,你可以通过引用传递它们。

所以你需要按如下方式实现你的功能:

def parse_csv(filename, gr, ent, work):
  ...
  gr.append(123)
  work.append(row)
  ...

然后你可以从这样的每个文件中调用它:

groups      = []
enterprise  = []
workinglist = []

parse_csv(filename, groups, enterprise, workinglist)

print groups # should contain the data read from CSV