Python3:处理CSV输出中的UTF8不兼容字符

时间:2013-07-12 18:26:24

标签: python sql unicode

我在Python3.2上并且有一个SQL输出我正在写入带有'Name'标识符和'specifics'的CSV文件。对于来自中国的一些数据,正在插入人名(以及汉字)。我已尽力阅读unicode / decode docs,但我对如何在Python中整体改进/删除这些字符感到茫然。

我正在运行这样的文件:

import csv, os, os.path
rfile = open(nonbillabletest2.csv,'r',newline='')
dataread= csv.reader(rfile)
trash=next(rfile) #ignores the header line in csv:

#Process the target CSV by creating an output with a unique filename per CompanyName
for line in dataread:
    [CompanyName,Specifics] = line
    #Check that a target csv does not exist
    if os.path.exists('test leads '+CompanyName+'.csv') < 1:
        wfile= open('test leads '+CompanyName+'.csv','a')
        datawrite= csv.writer(wfile, lineterminator='\n')
        datawrite.writerow(['CompanyName','Specifics']) #write new header row in each file created
        datawrite.writerow([CompanyName,Specifics])
wfile.close()    
rfile.close()

我收到此错误:

Traceback (most recent call last):
  File "C:\Users\Matt\Dropbox\nonbillable\nonbillabletest.py", line 26, in <module>
    for line in dataread:
  File "C:\Python32\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 1886: character maps to <undefined>

检查文件内容,显然是一些非UTF8字符:

  
    
      

print(repr(open('nonbillabletest2.csv','rb')。read()))

    
  
b'CompanyName,Specifics\r\neGENTIC,\x86\xac\xff; \r\neGENTIC,\x86\xac\xff; \r\neGENTIC,
\x86\xac\xff; \r\neGENTIC,\x91\x9d?; \r\neGENTIC,\x86\xac\xff; \r\n'

合并'encoding = utf8'无法解决问题。我已经能够用...替换('\ x86 \ xac \ xff',''))删除单个字符,但是我必须为每个可以编码的字符执行此操作,这样效率不高。< / p>

如果有一个SQL解决方案也没关系。请帮忙!


更新:我已按建议使用string.printable删除了字符。我还有一个错误,因为'contents'部分总是有一个最后一行。然而,添加if len = 0检查可以解决这个问题。

非常感谢你的快速帮助!

1 个答案:

答案 0 :(得分:1)

所以nonbillabletest2.csv不是用UTF-8编码的。

你可以:

  1. 将其修复到上游。确保它像您期望的那样正确编码为UTF-8。这可能是您所指的“SQL解决方案”。
  2. 事先删除所有非ascii字符(对于纯粹主义者来说,这会破坏数据,但是根据你所说的,你似乎可以接受)

    import csv, os, string
    rfile = open('nonbillabletest2.csv', 'rb')
    rbytes = rfile.read()
    rfile.close()
    
    contents = ''
    for b in rbytes:
      if chr(b) in string.printable + string.whitespace:
        contents += chr(b)
    
    dataread = csv.reader(contents.split('\r\n'))
    ....