2017-01-10 47 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] 

我试图寻找答案,它似乎是一个类型不匹配的二进制字符串。我试图打开文件作为“r”而不是“rb”,但是是相同的错误。请帮忙。代码如下。

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

欢迎来到Stack Overflow!为了给你一个很好的答案,如果你有一个[问],如果你还没有看过,它可能会帮助我们。如果你可以提供[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():在头无论如何写的,你会得到它两次。