2013-09-05 146 views
16

Tôi đang cố gắng thực hiện một số công việc dữ liệu trong gấu trúc Python và gặp khó khăn khi viết kết quả của mình. Tôi đọc dữ liệu của mình dưới dạng tệp CSV và xuất mỗi tập lệnh dưới dạng tệp CSV của chính nó hoạt động tốt. Gần đây mặc dù tôi đã cố gắng xuất khẩu tất cả mọi thứ trong 1 tập tin Excel với bảng tính và một vài trong số các tờ cho tôi một lỗiCodec Python to_excel 'utf8' codec không thể giải mã byte

" 'utf8' giải mã không thể giải mã byte 0xe9 ở vị trí 1: byte tiếp tục không hợp lệ"

Tôi không biết làm thế nào để bắt đầu tìm kiếm bất kỳ ký tự nào có thể gây ra sự cố khi xuất sang Excel. Bạn không chắc chắn lý do tại sao nó xuất khẩu sang CSV tốt mặc dù :(

dòng có liên quan

from pandas import ExcelWriter 
data = pd.read_csv(input) 
writer = ExcelWriter(output) #output is just the filename 
fundraisers.to_excel(writer, "fundraisers") 
locations.to_excel(writer, "locations") #error 
locations.to_csv(outputcsv) #works 
writer.save() 

in đứng đầu vi phạm dataframe

Event ID Constituent ID Email Address First Name \ Last Name 
f  1  A  A  1 
F  4  L  R  C 
M  1  1  A  D 
F  4  A  A  G 
M  2  0  R  G 
M  3  O  O  H 
M  2  T  E  H 
M  2  A  A  H 
M  2  M  M  K 
F  3  J  E  K 
Location ID raised raised con raised email 
a 0 0 0 
a 8 0 0 
o 0 0 0 
o 0 0 0 
o 0 0 0 
t 5 0 0 
o 1 0 0 
o 6 a 0 
o 6 0 0 
d 0 0 0 

nhìn vào bảng excel tôi thực sự có được một bản in từng phần ra Bất cứ điều gì trong cột tên đầu tiên và xa hơn là trống, nhưng sự kiện, thành phần và email tất cả các bản in. nó trong latin1 hoạt động. Có cách nào để chỉ định mã hóa to_excel không? Hoặc giải mã và mã hóa dataframe của tôi thành utf8?

+0

Bạn có thể đăng một số ký tự unicode có thể vi phạm của bạn không? Tạo ra các ký tự ngẫu nhiên tiếng Do Thái và sau đó viết chúng hoạt động ổn cho tôi. –

+2

Tôi không biết làm thế nào để tìm ra nhân vật mà nó thấy xúc phạm. – Wizuriel

+0

Một lý do khiến CSV khác nhau là do việc xuất Excel không được thực hiện bởi 'pandas' nó được thực hiện bởi các thư viện của bên thứ ba (' xlwt' và/hoặc 'openpyxl'). –

Trả lời

17

Được quản lý để giải quyết vấn đề này.

Tôi đã thực hiện một chức năng đi qua các cột có chuỗi và quản lý để giải mã/mã hóa chúng thành utf8 và giờ nó hoạt động.

def changeencode(data, cols): 
    for col in cols: 
     data[col] = data[col].str.decode('iso-8859-1').str.encode('utf-8') 
    return data 
+7

Cảm ơn! Chức năng này khá hữu ích. Sẽ rất hữu ích nếu Pandas có loại khả năng này được xây dựng, thay vì chỉ ném một lỗi nhỏ hơn nhiều (hoặc ít nhất là xác định hàng và cột đầu tiên mà nó gặp phải vấn đề). – murphsp1

1

không biết khi nào nó sẽ được phát hành nhưng bạn có thể thử với kho github của tôi:

https://github.com/jtornero/pandas

Bạn có thể sao chép nó và xây dựng gấu trúc từ nguồn; vấn đề là hầu như giải quyết và nó hoạt động như

sampleList = ['Miño', '1', '2', 'señora'] 
dataframe = pandas.DataFrame(sampleList) 
ew = pandas.ExcelWriter('./test.xls', encoding='utf-8') 
dataframe.to_excel(ew) 
ew.save() 

Cheers

Jorge TORNERO

4

Trên thực tế, có một cách để buộc mã hóa utf8 bằng cách thông qua một tham số để ExcelWriter:

ew = pandas.ExcelWriter('test.xlsx',options={'encoding':'utf-8'}) 
sampleList = ['Miño', '1', '2', 'señora'] 
dataframe = pandas.DataFrame(sampleList) 
dataframe.to_excel(ew) 
ew.save() 
+0

Trong '.to_csv' cũng có tham số' encoding' tùy chọn. – notconfusing

11

Trong trường hợp của tôi, vấn đề là ban đầu tôi đã đọc tệp CSV với mã hóa sai (ASCII thay vì cp1252). Do đó, khi gấu trúc đã cố gắng viết nó vào một tệp Excel, nó đã tìm thấy một số ký tự mà nó không thể giải mã được.

Tôi đã giải quyết nó bằng cách chỉ định mã hóa chính xác khi đọc tệp CSV.

data = pd.read_csv(fname, encoding='cp1252') 
2

Điều đơn giản nhất là tải khung dữ liệu của bạn vào utf-8. Sau đó, ExcelWriter sẽ tiết kiệm không có vấn đề gì.

data = pd.read_csv(path,encoding='utf-8') 
-1

tôi vẫn tiếp tục nhận được lỗi tương tự và ra khỏi tất cả các lời đề nghị điều duy nhất mà làm việc cho tôi là:

data = pd.read_csv('Filename.csv', encoding='cp1252') 

Cảm ơn bạn rất nhiều!

+0

Câu trả lời này đã được đề cập trước đó và bạn thêm và sửa đổi không có gì từ tuyên bố ban đầu đó. Trong tương lai, bạn chỉ cần bỏ phiếu cho câu trả lời phù hợp với mình. –

+0

Tôi chưa thể bỏ phiếu, nhưng tôi đã đánh giá cao một người có câu trả lời duy nhất làm việc cho tôi vì vậy tôi cảm thấy cần phải làm điều gì đó như xác nhận câu trả lời của họ. Một khi tôi có đủ đại diện, tôi sẽ upvote. – Dpsmurphy