2017-12-16 1 views
-1

typeError with csv file in python3 csvファイルにデータを書き込み、編集するPython3プログラムを作成しようとしましたが、 'str 'ではなくバイトのようなオブジェクトが必要です 端末の出力のスクリーンショットが添付されています。これは何を意味し、何が間違っているのか分かりません。誰かが私の修正を助けます。コードは以下の通りです:python3プログラムでcsvファイルを操作すると、 "TypeError: '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、 "")(「= '10' 送られ、量= 19.90、email='[email protected]

edit_data

+0

のPython 3では、あなたのファイル '開いて開く必要があります' csv'のリーダーやライター使用する場合( "data.csv"、 "R" を、改行= "") '。 'rb'を使うことはPython 2.xとのみ互換です。 –

答えて

0

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') 
関連する問題