Python - Typeerror: int object is not iterable

Asked

Viewed 442 times

1

This is my code:

import csv

def gravar(nome,idade, sexo):
    with open('cadastros.csv', 'w') as arquivo_csv:
        colunas = ['Nome', 'Idade', "Sexo"]
        escrever = csv.DictWriter(arquivo_csv, fieldnames=colunas, delimiter=',', lineterminator='\n')
        escrever.writeheader()
        escrever.writerow({'Nome' : nome, 'Idade' : idade, "Sexo" : sexo})

def ler():
   with open('cadastros.csv','r') as f:
       leitor = csv.DictReader(f, delimiter=',')
       for row in leitor:
           idades = row['Idade']
           idade = int(idades)
           soma = sum(idade)
           print(soma)


while True:

    print("1-Cadastrar Cliente\n"+
          "2-Idade Média\n"+
          "3-Sair\n")

    opcao = int(input("Coloque a opção desejada: \n"))

    if opcao == 1:
        quant = int(input("Quantidade de Clientes que você vai cadastrar!!"))
        for cliente in range(quant):
            nome = input("Coloque o nome do cliente: \n")
            idade = int(input("Coloque a idade do cliente: \n"))
            sexo = input("Coloque o sexo do cliente: \n")
            gravar(nome,idade,sexo)

    elif opcao == 2:
        ler()

    elif opcao == 3:
        print("\nSaindo!!")
        break

I’m trying to do a customer registration via csv, and I also have to calculate the average of all the age of all clients. I’m taking everyone’s age, turning it all into one code:

def ler():
   with open('cadastros.csv','r') as f:
       leitor = csv.DictReader(f, delimiter=',')
       for row in leitor:
           idades = row['Idade']
           idade = int(idades)
           soma = sum(idade)
           print(soma)

But he always makes that mistake:

Traceback (most recent call last):
  File "C:/Users/deagu.LAPTOP-13J3Q2U9/Desktop/Teste2/cadastros.py", line 37, in <module>
    ler()
  File "C:/Users/deagu.LAPTOP-13J3Q2U9/Desktop/Teste2/cadastros.py", line 16, in ler
    soma = sum(idade)
TypeError: 'int' object is not iterable

How can I solve?

1 answer

1


The function sum work with objects that can’t be changed, and you’re going through a int for the same:

idade = int(idades)
soma = sum(idade)

You can correct this passage by creating a simple accumulator of ages, see an example:

def ler():
   with open('cadastros.csv','r') as f:
       leitor = csv.DictReader(f, delimiter=',')
       idades = 0
       for row in leitor:
           idades = idades + int(row['Idade'])

       print(idades)

If you really want to use the function sum, you need to make some adjustments by filtering the Age within it and converting to int:

def ler():
   with open('cadastros.csv','r') as f:
       leitor = csv.DictReader(f, delimiter=',')
       idades = 0
       idades = sum([int(row['Idade']) for row in leitor])
       print(idades)

Any of the above examples will fix your error, but if you notice, you are only being registered a client in your csv, this is because when the file already exists, you are overwriting the data:

with open('cadastros.csv', 'w') as arquivo_csv:

To fix this, you need to open the file so that it keeping the previous data by appending the new ones:

with open('cadastros.csv', 'a+') as arquivo_csv:

It will also be necessary to treat the csv header, because it needs to be written only once, for this you can check the existence of the file, using for example the Path of pathlib, see an example of how the function gravar would be:

from pathlib import Path

def gravar(nome,idade, sexo):
    header = not Path('cadastros.csv').is_file()

    with open('cadastros.csv', 'a+') as arquivo_csv:
        colunas = ['Nome', 'Idade', "Sexo"]
        escrever = csv.DictWriter(arquivo_csv, fieldnames=colunas, delimiter=',', lineterminator='\n')
        if header:
          escrever.writeheader()
        escrever.writerow({'Nome' : nome, 'Idade' : idade, "Sexo" : sexo})

Finally, its function read, does not check if the file exists before making use of it, with this is generated an exception, here also we can make the existence check of the file using the pathlib:

def ler():
    if Path('cadastros.csv').is_file():
        with open('cadastros.csv','r') as f:
            leitor = csv.DictReader(f, delimiter=',')
            idades = sum([int(row['Idade']) for row in leitor])
            print(f"Média das idades {idades}\n")
    else:
        print("Não existem clientes cadastrados\n")

Your complete code would then look more or less like this:

import csv
from pathlib import Path

def gravar(nome,idade, sexo):
    header = not Path('cadastros.csv').is_file()

    with open('cadastros.csv', 'a+') as arquivo_csv:
        colunas = ['Nome', 'Idade', "Sexo"]
        escrever = csv.DictWriter(arquivo_csv, fieldnames=colunas, delimiter=',', lineterminator='\n')
        if header:
            escrever.writeheader()
        escrever.writerow({'Nome' : nome, 'Idade' : idade, "Sexo" : sexo})

def ler():
    if Path('cadastros.csv').is_file():
        with open('cadastros.csv','r') as f:
            leitor = csv.DictReader(f, delimiter=',')
            idades = sum([int(row['Idade']) for row in leitor])
            print(f"Média das idades {idades}\n")
    else:
        print("Não existem clientes cadastrados\n")

while True:

    print("1-Cadastrar Cliente\n"+
          "2-Idade Média\n"+
          "3-Sair\n")

    opcao = int(input("Coloque a opção desejada: \n"))

    if opcao == 1:
        quant = int(input("Quantidade de Clientes que você vai cadastrar: "))
        for cliente in range(quant):
            nome = input("Coloque o nome do cliente: \n")
            idade = int(input("Coloque a idade do cliente: \n"))
            sexo = input("Coloque o sexo do cliente: \n")
            gravar(nome,idade,sexo)

    elif opcao == 2:
        ler()

    elif opcao == 3:
        print("\nSaindo!!")
        break

See online: https://repl.it/@Dadinel/LeafyTenseBits


Documentations:

https://docs.python.org/3/library/pathlib.html

https://docs.python.org/3/library/functions.html#sum

Browser other questions tagged

You are not signed in. Login or sign up in order to post.