【问题标题】:Reading in a CSV: 'Str Object Is Not an Iterator'读取 CSV:“Str 对象不是迭代器”
【发布时间】:2019-06-06 03:16:32
【问题描述】:

我正在尝试读取 csv 文件并分析一些数据。但是,似乎我缺少 csv 导入的步骤,因为我无法遍历 csv 数据中的行。我正在使用 Python 3.7。以下是我的代码:

import csv

bank_csv_path = os.path.join("Bank/Resources/budget_data.csv")

total_months = 0
net_total = 0
avg_total = []
greatest_increase = 0
greatest_decrease = 0

with open(bank_csv_path, newline="") as csvfile:
    bank = csvfile.read()
    next(bank) 

这是我收到的 TypeError:

Traceback (most recent call last):
  File "bank.py", line 14, in <module>
    next(bank)
TypeError: 'str' object is not an iterator
(base) Grants-MBP-2:python-challenge grant$ 

我应该在下一个函数中添加它,我试图跳过标题行。

我还在学习这门语言,所以如果我应该在我的问题中包含更多信息,请告诉我,我会进行编辑。

【问题讨论】:

    标签: python python-3.x string csv


    【解决方案1】:

    python 变量next() 是一个迭代器,用于迭代特定类型的数据类型。现在,您的变量bank 是一个数据类型str。因此,您不能调用next(str),这就是您有错误输出的原因。相反,请尝试使用 for 循环逐行读取。

    with open('file.csv') as csv_file:
        csv_read = csv.reader(csv_file, delimiter=',')
        for row in csv_reader:
            print(row)
    

    另外,你可以看看有很多好东西的熊猫。相当于:

    import pandas as pd
    
    data = pd.read_csv(file)
    print(data)
    

    您的每一列都是您的数据,您可以像这样访问它: data['col_name'].max()

    【讨论】:

      【解决方案2】:

      您似乎并没有开始使用您的import csv

      看起来你正在通过open直接读取你的文件,这意味着如果你想跳过你的第一行,你可以改用:

      with open(bank_csv_path, newline="") as csvfile:
          bank = csvfile.readlines()
          bank = bank[1:]
      

      这将删除第一行

      还需要您的 csv 文件格式样本,因为我们不确定它使用的是什么分隔符。

      为了更好地处理 csv 文件,我建议改用 pandas

      import pandas as pd
      df = pd.read_csv(filepath, sep=',')
      

      【讨论】:

        【解决方案3】:

        您甚至没有使用csv 模块。这是做你想做的事情的正确方法:

        import csv
        
        bank_csv_path = os.path.join("Bank/Resources/budget_data.csv")
        
        total_months = 0
        net_total = 0
        avg_total = []
        greatest_increase = 0
        greatest_decrease = 0
        
        with open(bank_csv_path, newline="") as csvfile:
            reader = csv.reader(csvfile)  # Create a file reader.
            next(reader)  # Skip header.
            for row in reader:
                print(row)
        

        【讨论】:

          【解决方案4】:
          # use pandas to open csv files and slice and dice as you please
          
          import pandas as pd
          
          bank_csv_path = os.path.join("Bank/Resources/budget_data.csv")
          df = pd.read_csv(bank_csv_path)
          df.head()
          print(df)
          df.shape
          print(df.size)
          print(len(df)) #prints data frame (df) length
          print(df.columns) #prints column headers
          print(df['column 1'])
          #slicing data
          print(df["column 2"][:4]) #prints everything in column 2 starting at index 3
          print(df["column 2"][4]) #prints index 4 on column 2
          

          【讨论】:

            猜你喜欢
            • 2017-09-07
            • 1970-01-01
            • 2020-08-08
            • 2012-08-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-27
            相关资源
            最近更新 更多