2011-09-14 31 views
10

Tuyên bố từ chối trách nhiệm: Tôi ở Châu Âu.Python csv writer sai separator?

Theo this page Excel sử dụng dấu chấm phẩy ; làm dấu phân cách mặc định ở châu Âu để "ngăn xung đột" bằng dấu phẩy thập phân.

Bây giờ, tôi có mã Python này:

import csv 

data = [["test", "data"], ["foo", "bar"]] 
writer = csv.writer(open("data.csv", "wb"), dialect="excel") 
writer.writerows(data) 

nào nên tạo tập tin này:

test;data 
foo;bar 

nhưng thay vào đó nó sử dụng dấu phẩy. Tại sao chuyện này đang xảy ra? locale.getdefaultlocale() trả về ('nl_NL', 'cp1252').

+3

Tôi không hiểu ý nghĩa. Đó là một vấn đề liên quan, nó cho thấy nỗ lực nghiên cứu, và giải pháp không rõ ràng. –

+0

Các câu hỏi không liên quan khác nhau: Bạn đã đọc giải pháp thứ 4 trong "trang này" mà bạn đã trích dẫn chưa? Ai là người tiêu dùng dự định của tập tin SSV này - con người hay máy tính? Họ sẽ làm gì với nó? Bạn đã xem xét việc viết một tệp XLS hoặc XLSX (có thể làm cho ngôn ngữ bất khả tri, với sự quan tâm) không? –

Trả lời

16

Điều này là do phương ngữ csv.excel không phải là địa phương. Nếu bạn muốn sử dụng một cách rõ ràng dấu chấm phẩy là dấu phân cách thì bạn cần phải hoặc là vượt qua một cách rõ ràng dấu phân cách để csv.open như

writer = csv.writer(open("data.csv", "wb"), delimiter=";") 

hoặc tạo ra một phương ngữ mới và đăng ký nó

class excel_semicolon(csv.excel): 
    delimiter = ';' 
register_dialect("excel-semicolon", excel_semicolon) 

Trong cả hai trường hợp, bạn nên kiểm tra xem các số dấu phẩy động được viết như thế nào ... Tôi nghi ngờ chúng sẽ không được viết theo định dạng Châu Âu mà bạn mong muốn (với dấu phẩy làm cơ số)

6

Các phương ngữ excel được xác định bởi các thuộc tính sau (trong Lib/csv.py, line 57):

delimiter = ',' 
quotechar = '"' 
doublequote = True 
skipinitialspace = False 
lineterminator = '\r\n' 
quoting = QUOTE_MINIMAL 

tôi thấy không có gợi ý, rằng đây là bằng cách nào đó locale phụ thuộc vào - vì thế bạn sẽ luôn có được , với mặc định phương ngữ.

Nhưng điều đó dễ dàng được khắc phục, ví dụ:

class excel_semicolon(csv.excel): 
    delimiter = ';' 

writer = csv.writer(open("data.csv", "wb"), dialect=excel_semicolon) 
+0

Chắc chắn nó dễ dàng cố định, nhưng tôi giả định nếu Python bao gồm phương ngữ excel nó sẽ thực hiện nó một cách chính xác = S – orlp

+0

@miku: -1. Sau câu lệnh thứ hai của bạn, 'csv.excel.delimiter' dùng để chỉ' ';' 'thay vì' ',' '. Đọc câu trả lời của @Donkopotamus. –

+0

@John, Cảm ơn, đã sửa. – miku