2015-06-08 18 views
9

Tôi đang cố viết danh sách dữ liệu vào tệp csv. Kể từ khi đó là một danh sách các chuỗi byte, tôi đã sử dụng mã dưới đâyLoạiError: mã hóa hoặc lỗi mà không có đối số chuỗi

with open(r"E:\Avinash\Python\extracting-drug-data\out.csv", "wb") as w: 
    writer = csv.writer(w) 
    writer.writerows(bytes(datas, 'UTF-8')) 

Nhưng nó kết quả trong các lỗi sau:

TypeError: encoding or errors without a string argument

datas là một danh sách các chuỗi byte.

print(datas) 

mang

[b'DB08873', b' MOLSDFPDBSMILESInChIView Structure \xc3\x97Structure for DB08873 (Boceprevir) Close', b'394730-60-0', b'LHHCSNFAOIFYRV-DOVBMPENSA-N', b'Organic acids and derivatives ', b'Food increases exposure of boceprevir by up to 65% relative to fasting state. However, type of food and time of meal does not affect bioavailability of boceprevir and thus can be taken without regards to food. \r\nTmax = 2 hours;\r\nTime to steady state, three times a day dosing = 1 day;\r\nCmax] 

Tôi muốn danh sách trên được in như dòng đầu tiên trong một tập tin csv với giải mã ký tự unicode. Tức là, \xc3\x97 phải được chuyển đổi thành ký tự tương ứng của nó.

+0

Vì bạn muốn chuyển đổi byte trở lại thành chuỗi, không nên là 'str (datas, 'UTF-8')' thay thế? (Ngoài ra, bạn không nên áp dụng nó cho từng phần tử, thay vì toàn bộ danh sách?) –

+0

Ngoài ra, đối với 'writerows', không nên' dữ liệu' là danh sách các danh sách? –

+0

@tobias_k hiển thị 'LoạiError: co giật để str: cần một đối tượng giống như byte, danh sách tìm thấy' –

Trả lời

8

Dường datas bạn đã có trong định dạng byte, do đó, để biến nó thành UTF-8 chuỗi, bạn phải sử dụng str, không bytes! Ngoài ra, bạn phải chuyển đổi từng phần tử từ datas riêng lẻ, không phải toàn bộ danh sách cùng một lúc. Cuối cùng, nếu bạn muốn thêm datas làm một hàng vào out.csv, bạn phải sử dụng writerow, trong khi writerows sẽ viết tất cả các hàng cùng một lúc và accordinly sẽ mong đợi danh sách danh sách.

Tùy thuộc vào hệ điều hành của bạn, bạn cũng có thể phải chỉ định encoding khi mở tệp. Nếu không, nó sẽ sử dụng mã hóa mặc định của hệ điều hành, có thể là một cái gì đó hoàn toàn khác.

Điều này dường như để làm những gì bạn muốn. Kết quả là tệp CSV có một hàng dữ liệu ở định dạng UTF-8 và \xc3\x97 được giải mã thành ×.

import csv 
with open(r"out.csv", "w", encoding='UTF-8') as w: 
    writer = csv.writer(w) 
    writer.writerow([str(d, 'UTF-8') for d in datas]) 

1) Lưu ý rằng mục cuối cùng trong datas chứa một số ngắt dòng, và do đó sẽ được chia vào một vài dòng. Điều này có lẽ không phải là những gì bạn muốn. Hoặc đây có phải là trục trặc trong danh sách datas của bạn không?

+0

Phụ lục: Nếu bạn muốn giải mã unicode nhưng giữ '\ n' được thoát, bạn có thể thử' repr (str (d, 'UTF-8')) ', nhưng tôi không chắc đó có phải là thứ bạn muốn hay không. Điều này cũng sẽ quấn tất cả các chuỗi trong '''' –

+0

đã cố gắng điều đó, nhưng nó cho thấy 'TypeError: 'str' không hỗ trợ giao diện đệm' –

+0

@AvinashRaj Tôi nhận được lỗi đó, sửa nó bằng cách thay đổi chế độ tập tin từ' wb' đến 'w'. (Tôi không nghĩ rằng 'b' (nhị phân) có ý nghĩa đối với tệp CSV) Xin lỗi, quên đề cập đến thay đổi đó. –

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