【问题标题】:Importing CSV-file as list returns empty list将 CSV 文件作为列表导入会返回空列表
【发布时间】:2021-03-23 11:33:48
【问题描述】:

这个问题让我发疯了。

我想逐行导入 CSV 文件。

我尝试了以下代码:

import csv

def read_file():
    with open ('filepath', 'r') as file:
        csv_reader = csv.reader(file, delimiter=';') 
        data=[] 
        for rad in csv_reader: 
            data.append(rad) 

read_file()
print(data)

尝试打印数据时,我收到以下错误消息:

/Users/user/PycharmProjects/pythonProject11/venv/bin/python /Users/user/PycharmProjects/pythonProject11/main.py
Traceback (most recent call last):
  File "filepath", line 12, in <module>
    print(data)
NameError: name 'data' is not defined

Process finished with exit code 1

如果我在 import csv 之后和 def read_file() 之前定义 data=[] ,则代码有效。但是,我需要在函数 read_file 中定义数据。

有什么建议吗?

数据如下:

[['', '2018', '2018', '2015', '2015', '2012', '2012', '2009', '2009', '2006', '2006', '2003', '2003', '2018', '2015', '2012', '2009', '2006', '2003'], ['', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', 'medel', 'medel', 'medel', 'medel', 'medel', 'medel'], ['Australia', '494', '488', '497', '491', '510', '498', '519', '509', '527', '513', '527', '522', '491', '494', '504', '514', '520', '524'], ['Austria', '505', '492', '510', '483', '517', '494', '506', '486', '517', '494', '509', '502', '499', '497', '506', '496', '505', '506']] 

【问题讨论】:

  • return 函数中的数据? data 只是一个局部变量。你需要把它放到全局范围内。添加一个return data作为函数的最后一行,然后像data = read_file()一样调用它
  • 你需要return data
  • 顺便说一下,这里不需要循环。它可以是data = list(csv_reader)...
  • @Tomerikoo 成功了。令人惊讶的是我如何忽略它。谢谢你。如果你发布你的答案,我会宣布它有效。

标签: python


【解决方案1】:

这是因为在函数内部声明的变量仅在该函数内部可用,而在全局范围内不可用。在这种情况下,我的建议是在您完成读取文件后从函数中返回数据。换句话说,是这样的:

import csv

def read_file():
    with open ('filepath', 'r') as file:
        csv_reader = csv.reader(file, delimiter=';') 
        data=[] 
        for rad in csv_reader: 
            data.append(rad)

    return data

file_data = read_file()
print(file_data)

也可以在函数中将data 变量设为全局变量,但通常不建议这样做,因为全局变量很快变得难以跟踪,当数据从哪里来时更容易查看从这样的函数返回。

【讨论】:

    【解决方案2】:

    修改您的代码(如下所示)以从函数中返回数据变量:

    import csv
    
    def read_file():
        with open ('filepath', 'r') as file:
            csv_reader = csv.reader(file, delimiter=';') 
            data = [] 
            for rad in csv_reader: 
                data.append(rad) 
    
            return data
    
    data = read_file()
    print(data)
    

    【讨论】:

      【解决方案3】:

      您可以将数据声明为函数外部的全局变量。目前data 仅在函数范围内可见,但在您打印它的函数之外看不到。您可以了解更多关于 python 作用域的信息here

      import csv
      
      data=[]
      
      def read_file():
          with open ('filepath', 'r') as file:
              csv_reader = csv.reader(file, delimiter=';')  
              for rad in csv_reader: 
                  data.append(rad) 
      
      read_file()
      print(data)
      

      【讨论】:

      • 最好尽可能避免这种情况。这导致代码不清楚(read_file 修改一些数据而不是返回它)并且依赖于预先声明的一些变量
      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      相关资源
      最近更新 更多