名称错误:名称' enddata'未定义(在函数内)

时间:2017-09-01 17:22:39

标签: python

当我尝试运行时,它会说" enddata"未定义,即使它是包含文档格式化数据的列表。有没有更好的方法来编写这部分?

def openfile ():

    global enddata
    global index

    file=open("weatherData.csv","r")
    data=file.readlines()
    file.close()

    enddata=[]
    index=0

    for sample in data:
        enddata.append(data[index].split(","))
        index +=1

    print("-"*50)

    return enddata

print(enddata)

3 个答案:

答案 0 :(得分:0)

正如其他人指出的那样,你必须调用openfile函数:代码可能是这样的:

def openfile ():

    global enddata
    global index

    file=open("weatherData.csv","r")
    data=file.readlines()
    file.close()

    enddata=[]
    index=0

    for sample in data:
        enddata.append(data[index].split(","))
        index +=1

    print("-"*50)

    return enddata

openfile()
print(enddata)

另一种做得更短和pythonic的方法可能是:

def openfile():
    with open("weatherData.csv") as f:
        return [line.split(',') for line in f]

enddata = openfile()
print("-"*50)
print(enddata)

值得探索csv Python模块:

import csv

def openfile():
    with open('weatherData.csv') as f:
        return list(csv.reader(f))

enddata = openfile()
print("-"*50)
print(enddata)

答案 1 :(得分:0)

您必须致电openfile才能初始化(并创建)全局名称enddata。但是,您不应该使用全局变量。让openfile 返回您分配给enddata的值,并将其分配给调用范围中的变量。

其他一些提示:

  • 您的功能不会只是打开一个文件,它会读取并返回一些数据。
  • 使用with语句管理打开和关闭文件。
  • 不要立刻将整个文件读入内存;逐行阅读。
  • 在某种意义上,您正在迭代data两次:一次使用for循环,再一次使用index。在每次迭代期间似乎sample == data[index]。可以使用单个列表理解来处理整个迭代。
  • 使用csv模块读取CSV文件。

全部放在一起:

import csv

def read_file(fname):
    with open(fname) as fh:
        return list(csv.reader(fh))

enddata = read_file("weatherData.csv")

答案 2 :(得分:0)

这是一种稍微更高级的代码编写方式。

  • 我使用with statement so that I don't have to remember to close the file. It makes the code more compact in general. weatherData`成为该文件的别名。
  • sample成为输入文件中一行的名称。
  • 值得注意的是,文件中的每一行都有一个所谓的“行端”'必须被剥离;因此.strip()。然后我可以使用逗号.split
  • 由于每个输入行可以包含多个值,因此我使用.extend将它们添加到enddata
  • 我写了print (openfile())来查看结果。或者我可以写result = openfile(); print(result)

def openfile():
    enddata = []
    with open('weatherData.csv') as weatherData:
        for sample in weatherData.readlines():
            enddata.extend(sample.strip().split(','))
    return enddata

print (openfile())

输出:

['1', '2', '3', '4', '5', '6']