在python3程序中使用csv文件显示“TypeError:需要类似字节的对象,而不是'str'”

问题描述 投票:-1回答:1

typeError with csv file in python3I试图编写一个python3程序,在csv文件中编写和编辑数据,但是它显示TypeError:需要一个类似字节的对象,而不是'''终端输出的截图。我不知道是什么这意味着什么是错的。有人帮我解决了。代码如下:

import csv
import datetime
import shutil
from tempfile import NamedTemporaryFile


def get_length(file_path):
    with open("data.csv", "r") as csvfile:
    #some csv file data.csv is created in the same directory
        reader = csv.reader(csvfile)
        reader_list = list(reader)
        return len(reader_list)

def append_data(file_path, name, email, amount):
    fieldnames = ['id', 'name', 'email', 'amount', 'sent', 'date']
    #the number of rows?
    next_id = get_length(file_path)
    with open(file_path, "a") as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writerow({
                "id": next_id,
                "name": name,
                "email": email,
                "sent": "",
                "amount": amount,
                "date": datetime.datetime.now()
            })

#append_data("data.csv", "some name", "[email protected]", 123.456)

def edit_data(edit_id=None, email=None, amount=None, sent=None):
    filename = "data.csv"
    temp_file = NamedTemporaryFile(delete=False)

    with open(filename, "rb") as csvfile, temp_file:
        reader = csv.DictReader(csvfile)
        fieldnames = ['id', 'name', 'email', 'amount', 'sent', 'date']
     writer = csv.DictWriter(temp_file, fieldnames=fieldnames)
    writer.writeheader()
    for row in reader:
        #print(row['id'] == 4)
        if edit_id is not None:
            if int(row['id']) == int(edit_id):
                row['amount'] = amount
                row['sent'] = sent
        elif email is not None and edit_id is None:
            if str(row['email']) == str(email):
                row['amount'] = amount
                row['sent'] = sent
        else:
            pass
        writer.writerow(row)

    shutil.move(temp_file.name, filename)
    return True
return False

edit_data(8, 9992.32, "")

edit_data(email='[email protected]',金额= 19.90,已发送= '10')

python csv
1个回答
1
投票

在Python 3上使用csv阅读器和编写器时,您需要打开文件open("data.csv", "r", newline="")。使用rb仅与Python 2.x兼容。您还需要为NamedTemporaryFile设置类似的设置。

以下应该有所帮助:

import csv
import datetime
import shutil
from tempfile import NamedTemporaryFile

fieldnames = ['id', 'name', 'email', 'amount', 'sent', 'date']

def edit_data(edit_id=None, email=None, amount=None, sent=None):
    filename = "data.csv"

    with open(filename, "r", newline="") as csvfile, \
        NamedTemporaryFile(delete=False, mode="w", newline="") as temp_file:

        reader = csv.DictReader(csvfile, fieldnames=fieldnames)
        writer = csv.DictWriter(temp_file, fieldnames=fieldnames)
        writer.writeheader()

        for row in reader:
            #print(row['id'] == 4)
            if edit_id is not None:
                if int(row['id']) == int(edit_id):
                    row['amount'] = amount
                    row['sent'] = sent
            elif email is not None and edit_id is None:
                if str(row['email']) == str(email):
                    row['amount'] = amount
                    row['sent'] = sent
            else:
                pass
            writer.writerow(row)

    shutil.move(temp_file.name, filename)

edit_data(email='[email protected]', amount=19.90, sent='10')
© www.soinside.com 2019 - 2024. All rights reserved.