PythonCSV编写器正在向每个元素的开头添加字母,并且出现了encode问题

PythonCSV编写器正在向每个元素的开头添加字母,并且出现了encode问题,python,csv,unicode,Python,Csv,Unicode,所以我试图将JSON文件解析成一个以制表符分隔的文件。解析似乎工作正常,所有的数据都通过了。尽管最奇怪的事情发生在输出文件上。我告诉它使用制表符分隔符,在输出中它确实使用制表符,但它似乎仍然保留单引号。出于某种原因,它似乎也在开头加上了字母B。我手动输入了标题,这很好,但是数据本身表现得很奇怪。这是我得到的输出的一个例子 id created text screen name name latitude longitude place name place type b

所以我试图将JSON文件解析成一个以制表符分隔的文件。解析似乎工作正常,所有的数据都通过了。尽管最奇怪的事情发生在输出文件上。我告诉它使用制表符分隔符,在输出中它确实使用制表符,但它似乎仍然保留单引号。出于某种原因,它似乎也在开头加上了字母B。我手动输入了标题,这很好,但是数据本身表现得很奇怪。这是我得到的输出的一个例子

id  created text    screen name name    latitude    longitude   place name  place type
b'1234567890'   b'Thu Mar 14 19:39:07 +0000 2013'   "b""I'm at Bank Of America (Wayne, MI) http://t.co/asdf"""  b'userid'   b'username' 42.28286837 -83.38487864    b'Bank Of America, Wayne'   b'poi'
b'1234567891'   b'Thu Mar 14 19:39:16 +0000 2013'   b'here is a sample tweet \xf0\x9f\x8f\x80 #notingoodhands'  b'userid2'  b'username2'
下面是我用来写出数据的代码

out = open(filename, 'w')
   out.write('id\tcreated\ttext\tscreen name\tname\tlatitude\tlongitude\tplace name\tplace type')
   out.write('\n')
   rows = zip(ids, times, texts, screen_names, names, lats, lons, place_names, place_types)
   from csv import writer
   csv = writer(out, dialect='excel', delimiter = '\t')
   for row in rows:
       values = [(value.encode('utf-8') if hasattr(value, 'encode') else value) for value in row]
       csv.writerow(values)
   out.close()
事情是这样的。如果我在没有utf-8位的情况下这样做并直接输出它,格式将完全符合我的要求。但当人们输入特殊字符时,程序崩溃,无法处理

Traceback (most recent call last):
  File "tweets.py", line 34, in <module>
    csv.writerow(values)
  File "C:\Python33\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f3c0' in position 153: character maps to <undefined>
回溯(最近一次呼叫最后一次):
文件“tweets.py”,第34行,在
csv.writerow(值)
文件“C:\Python33\lib\encodings\cp1252.py”,第19行,编码
返回codecs.charmap\u encode(输入、自身错误、编码表)[0]
UnicodeEncodeError:“charmap”编解码器无法对153位置的字符“\U0001f3c0”进行编码:字符映射到

添加utf-8位会将其转换为您在此处看到的输出类型,但随后会将所有这些字符添加到输出中。有人对此有什么想法吗?

您正在向文件中写入字节数据而不是unicode,因为您自己正在对数据进行编码

完全删除
encode
调用,让Python为您处理这个问题;使用UTF8编码打开文件,其余部分自行处理:

out = open(filename, 'w', encoding='utf8')
这记录在以下文件中:

由于
open()
用于打开CSV文件进行读取,因此默认情况下,该文件将使用系统默认编码解码为unicode(请参阅)。要使用不同的编码对文件进行解码,请使用open的encoding参数:

import csv
with open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
         print(row)
这同样适用于以系统默认编码以外的方式写入:在打开输出文件时指定编码参数


这里发生了很多事情,但首先,让我们澄清一些困惑


将非ASCII字符编码为UTF-8意味着您将获得多个字节。例如,字符
如何处理
request.FILES.get('file')
?@webaholik:只需将对象包装在
TextIOWrapper
如果request.FILES:
使用TextIOWrapper(request.FILES['file'].file)作为f:
,然后将
f
传递给
csv.reader()