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

Python 名称错误:名称';enddata';未定义(在函数内部),python,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”没有定义,即使它是一个包含文档中格式化数据的列表。有没有更好的方法来编码这个部分

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)

正如其他人所指出的,您必须调用
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)
另一种更简短、更通俗的方法是:

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

enddata = openfile()
print("-"*50)
print(enddata)
值得探索Python模块:

import csv

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

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

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

其他一些提示:

  • 你的函数不仅仅是打开一个文件,它读取它并返回一些数据
  • 使用
    with
    语句管理文件的打开和关闭
  • 不要一次将整个文件读入内存;逐行读
  • 从某种意义上讲,您将在
    数据上迭代两次:一次使用
    for
    循环,另一次使用
    索引。在每次迭代期间,
    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")

这是一种更高级的代码编写方法

  • 我使用
    with语句,这样我就不必记得关闭文件了。它使代码总体上更加紧凑。
    weatherData`成为文件的别名
  • sample
    成为输入文件中一行的名称
  • 需要注意的是,文件中的每一行都有一个所谓的“行尾”,必须去掉它;因此出现了
    .strip()
    。然后我可以在逗号上执行
    .split
  • 因为每个输入行可以包含多个值,所以我使用
    .extend
    将它们添加到
    enddata
  • 我编写了
    print(openfile())
    来查看结果。或者,我可以编写
    result=openfile();打印(结果)

输出:

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

您是否调用过
openfile
函数?友好的建议:不要忘记您曾经知道存在
global
。这将是这里任何人都能提供的最好建议。由于
enddata
是您希望在
openfile
函数之外提供的东西,因此您只需要
返回它,这就是您所做的。由于
返回enddata
可以使用
print(openfile())
而不是
print(enddata)
来使用函数的结果。不要使用
global
-您没有全局定义enddata,也没有调用openfile(),这就是为什么会出现错误的原因。
['1', '2', '3', '4', '5', '6']