2017-12-16 1 views
-1

typeError with csv file in python3 Ich habe versucht, ein Python3-Programm zu schreiben, das Daten in der CSV-Datei schreibt und bearbeitet, aber es TypeError zeigt: ein Byte-ähnliches Objekt ist erforderlich, nicht ' Screenshot der Ausgabe im Terminal ist angeschlossen.Ich weiß nicht, was das bedeutet und was falsch ist.Einige helfen mir, es zu beheben.der Code ist unter:Arbeiten mit csv-Datei in Python3-Programm zeigt "TypeError: ein Byte-ähnliches Objekt erforderlich ist, nicht 'str'"

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]‘, amount = 19.90, gesendet = '10')

+0

Am 3. Python, wenn Sie zu öffnen, um mit 'csv' Leser und Schreiber Ihre Datei' open ("data.csv", "r", Newline = "") '. Die Verwendung von 'rb' ist nur mit Python 2.x kompatibel. –

Antwort

0

In Python 3, wenn Sie CSV-Reader und Writer verwenden, müssen Sie Ihre Datei öffnen open("data.csv", "r", newline=""). Die Verwendung von rb ist nur mit Python 2.x kompatibel. Sie müssen auch ähnliche Einstellungen für Ihre NamedTemporaryFile einrichten.

Folgendes sollte helfen:

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') 
Verwandte Themen