2017-01-10 14 views
0

私はPython(そしてプログラミング全般)の非常に新しいです。下に貼り付けられたコードは、既存のcsvを編集するためのものです。しかし、私はエラーが発生しています。 エラーは、私が答えを探すためにしようとしていcsvファイルの読み書き中にエラーが発生しました。 strとバイナリの間の型の不一致

Traceback (most recent call last): 
    File "C:\Users\Samsung Pc\Desktop\hungrypy1\hungry_data.py", line 34, in <module> 
    writer.writeheader() 
    File "C:\Users\Samsung Pc\AppData\Local\Programs\Python\Python36-32\lib\csv.py", line 144, in writeheader 
    self.writerow(header) 
    File "C:\Users\Samsung Pc\AppData\Local\Programs\Python\Python36-32\lib\csv.py", line 155, in writerow 
    return self.writer.writerow(self._dict_to_list(rowdict)) 
    File "C:\Users\Samsung Pc\AppData\Local\Programs\Python\Python36-32\lib\tempfile.py", line 483, in func_wrapper 
    return func(*args, **kwargs) 
TypeError: a bytes-like object is required, not 'str' 
[Finished in 0.5s] 

であり、バイナリから文字列への型の不一致のようです。私は "rb"の代わりに "r"としてファイルを開こうとしましたが、同じエラーです。助けてください。コードは以下の通りです。

import csv 
import shutil 
from tempfile import NamedTemporaryFile 

def get_length(file_path): 
    with open("data.csv", "r") as csvfile: 
     reader = csv.reader(csvfile) 
     reader_list = list(reader) 
     print(reader_list) 
     return len(reader_list) 

def append_data(file_path, name, email): 
    fieldnames = ['id', 'name', 'email' 
    next_id = get_length(file_path) 
    with open(file_path, "a", newline = '') as csvfile: 
     writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
     writer.writeheader() 
     writer.writerow({ 
       "id": next_id, 
       "name": name, 
       "email": email, 
      }) 

append_data("data.csv", "Niraj", "[email protected]") 

filename = "data.csv" 
temp_file = NamedTemporaryFile(delete = False) 

with open(filename, "r") as csvfile, temp_file: 
    reader = csv.DictReader(csvfile) 
    fieldnames = ['id','name','email','amount','sent'] 
    writer = csv.DictWriter(temp_file, fieldnames = fieldnames) 
    writer.writeheader() 

    for row in reader: 
     writer.writerow({ 
      "id" : row["id"], 
      "name" : row["name"], 
      "email": row["email"], 
      "amount": "1234.34", 
      "sent": "", 
      }) 

#shutil.move(temp_file.name. filename) 
+0

ようこそスタックオーバーフロー!あなたに素晴らしい答えを与えるために、もしあなたがまだ持っていなければ、あなたが[尋ねる]を一目で把握すれば、私たちを助けるかもしれません。あなたが[mcve]を提供できるなら、それは役に立つかもしれません。 – Mat

答えて

0

あなたが読んで、同時に同じファイルに書き込むべきではありません。

with open(filename, "r") as csvfile, temp_file: 

このファイルに二つの名前を与えるにもかかわらず、彼らはあなたのディスクで同じファイルをポイントしている、changehをそれへ:

with open(filename, "r") as csvfile, open('temp_file.csv', 'w') as temp_file: 
0

何をやっている:

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

, temp_file部分は厳密には何もしません。 ...

その後、temp_fileを出力ファイルハンドルとして使用していますが、実際にはという文字列、つまりメッセージが表示されます。

あなたがこれを行うにしたい:

with open(filename, "r") as csvfile, open(temp_file,"w",newline='') as outfile: 

、その後outfileを使用し、ないtemp_file:脇

writer = csv.DictWriter(outfile, fieldnames = fieldnames) 

writer.writeheader()を使用しないでください:ヘッダがとにかく書かれている、あなたが取得しますがそれは二度。

関連する問題