2015-10-05 20 views
5

Tôi không hoàn toàn chắc chắn những gì tôi cần làm về lỗi này. Tôi cho rằng nó phải làm với việc cần thêm .encode ('utf-8'). Nhưng tôi không hoàn toàn chắc chắn nếu đó là những gì tôi cần phải làm, cũng không phải nơi tôi nên áp dụng điều này.Codec ASCII của Python không thể mã hóa lỗi ký tự khi ghi vào CSV

Lỗi này là:

line 40, in <module> 
writer.writerows(list_of_rows) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 1 
7: ordinal not in range(128) 

này là cơ sở của kịch bản python của tôi.

import csv 
from BeautifulSoup import BeautifulSoup 

url = \ 
'https://dummysite' 

response = requests.get(url) 

html = response.content 

soup = BeautifulSoup(html) 

table = soup.find('table', {'class': 'table'}) 

list_of_rows = [] 
for row in table.findAll('tr')[1:]: 
list_of_cells = [] 
for cell in row.findAll('td'): 
    text = cell.text.replace('[','').replace(']','') 
    list_of_cells.append(text) 
list_of_rows.append(list_of_cells) 

outfile = open("./test.csv", "wb") 
writer = csv.writer(outfile) 
writer.writerow(["Name", "Location"]) 
writer.writerows(list_of_rows) 

Trả lời

15

Python 2.x Thư viện CSV bị hỏng. Bạn có ba lựa chọn. Theo thứ tự phức tạp:

  1. Chỉnh sửa: Xem bên dưới Sử dụng thư viện cố định https://github.com/jdunck/python-unicodecsv ( pip install unicodecsv). Sử dụng như một sự thay thế thả trong - Ví dụ:

    with open("myfile.csv", 'rb') as my_file:  
        r = unicodecsv.DictReader(my_file, encoding='utf-8') 
    

  1. Đọc Unicode CSV thủ công liên quan đến: https://docs.python.org/2/library/csv.html (Xem ví dụ ở phía dưới)

  2. thủ mã hóa từng hạng mục như UTF-8:

    for cell in row.findAll('td'): 
        text = cell.text.replace('[','').replace(']','') 
        list_of_cells.append(text.encode("utf-8")) 
    

Chỉnh sửa, tôi tìm thấy python-unicodecsv cũng bị hỏng khi đọc UTF-16. Nó phàn nàn về bất kỳ 0x00 byte nào.

Thay vào đó, sử dụng https://github.com/ryanhiebert/backports.csv, giống như chặt chẽ hơn việc thực hiện Python 3 và sử dụng mô-đun io ..

Install:

pip install backports.csv 

Cách sử dụng:

from backports import csv 
import io 

with io.open(filename, encoding='utf-8') as f: 
    r = csv.reader(f): 
+0

oh wow không biết rằng thư viện CSV đã bị hỏng trong python. Cảm ơn nhiều! Đó là một trợ giúp rất lớn – paintball247

+2

Tại sao điều này không được bình chọn đủ? Tôi dường như mọi người sử dụng tất cả các loại giải pháp để giải quyết điều này, và thành thật mà nói, không có cách nào hoạt động tốt hơn là chỉ sử dụng mô-đun "unicodecsv". –

0

Tôi tìm thấy tùy chọn dễ dàng nhất, ngoài các đề xuất tuyệt vời của Alastair, để được sử dụng python3 thay vì python 2. tất cả nó cần thiết trong scr của tôi ipt đã thay đổi wb trong tuyên bố open chỉ đơn giản là w trong accordance with Python3's syntax.

Các vấn đề liên quan