2015-11-18 16 views
8

Tôi cố gắng để đọc tập tin với Python một CSV với đoạn mã sau:Reading UTF-8 với BOM sử dụng mô-đun Python CSV gây thêm các ký tự không mong muốn

with open("example.txt") as f: 
    c = csv.reader(f) 
    for row in c: 
     print row 

My example.txt chỉ có các nội dung sau đây:

 
Hello world! 

Đối với UTF-8 hoặc các tập tin ANSI mã hóa, điều này mang lại cho tôi kết quả dự kiến:

> ["Hello world!"] 

Nhưng nếu tôi lưu các tập tin như UTF-8 với BOM tôi nhận được kết quả này:

> ["\xef\xbb\xbfHello world!"] 

Vì tôi không có bất cứ quyền kiểm soát những tập tin người dùng sẽ sử dụng như là đầu vào, tôi sẽ như thế này để làm việc với BOM cũng. Làm cách nào để khắc phục sự cố này? Tôi có cần phải làm gì để đảm bảo rằng nó cũng hoạt động với các mã hóa khác không?

+1

NB: bất kỳ giải pháp nào bạn sử dụng, điều quan trọng là sử dụng 'utf-8-sig' để giải mã. – ekhumoro

+0

'nhập khẩu csv, csvkit, codec, unicodecsv với mở ("example.txt", 'r') như f: c = csv.reader (f) cho hàng trong c: in [unicode (s, "utf-8") cho s trong hàng] với mở ("example.txt", 'r') như f: c = unicodecsv.reader (f) cho hàng trong c: in hàng với mở ("example.txt", 'r') là f: c = csvkit.reader (f) cho hàng trong c: in hàng' tất cả các bản in '[u '\ ufeffHello world!']' so i ithink nó không phải là ** trùng lặp ** - lần thử đầu tiên là sử dụng http://stackoverflow.com/questions/17245415/read-and-write-csv-files-in cluding-unicode-with-python-2-7 – SIslam

+0

@ekhumoro: Bản sao là đường biên giới ... Câu hỏi khác là về dữ liệu UTF-8 trong khi điều này đặc biệt về BOM trong tệp utf8. Trang kia chỉ nói (chỉ trong một câu trả lời) của BOM cho các tệp UTF-16. Bình luận của bạn không trả lời câu hỏi này nhưng IMHO nó sẽ xứng đáng là một câu trả lời trên một câu hỏi không trùng lặp :-) –

Trả lời

2

Bạn có thể tận dụng các mô-đun unicodecsv Python như sau:

import unicodecsv 

with open('input.csv', 'rb') as f_input: 
    csv_reader = unicodecsv.reader(f_input, encoding='utf-8-sig') 
    print list(csv_reader) 

Vì vậy, đối với một tập tin đầu vào có chứa sau trong UTF-8 với BOM:

c1,c2,c3,c4,c5,c6,c7,c8 
1,2,3,4,5,6,7,8 

Nó sẽ hiển thị như sau :

[[u'c1', u'c2', u'c3', u'c4', u'c5', u'c6', u'c7', u'c8'], [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8']] 
+0

nhưng về '\ ufeff' thì sao? không phải là nó vô ích? – SIslam

+2

Thật vậy, tôi đặt sai mã hóa trong, như đã nói 'utf-8-sig' nên được sử dụng. –

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