2011-09-14 25 views
10

Yasal Uyarı: Ben Avrupa'dayım.Python csv yazarı yanlış ayırıcı mı?

this page'a göre Excel, noktalı virgül ile "çakışmaları önlemek" için Avrupa'daki varsayılan ayırıcı olarak noktalı virgül ;'u kullanır.

import csv 

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

bu dosyayı oluşturmak gerekir:

Şimdi, bu Python koduna sahip

test;data 
foo;bar 

ama bunun yerine virgül kullanılır. Bu neden oluyor? locale.getdefaultlocale(), ('nl_NL', 'cp1252') değerini döndürür.

+3

Reddini anlamıyorum. İlgili bir problem, araştırma çabasını gösteriyor ve çözüm bu kadar açık değil. –

+0

Çeşitli alakasız sorular: Alıntı yaptığınız "bu sayfada" 4. çözümü okudun mu? Bu SSV dosyasının tüketicileri kimler - insanlar veya bilgisayarlar? Bununla ne yapacaklar? Bir XLS veya XLSX dosyası yazmayı düşündünüz mü (yerel olarak agnostik, dikkatle yapılabilir)? –

cevap

16

Bunun sebebi, csv.excel diyalektiğinin yerel olarak bilinmemesidir. Açıkça ayırıcı olarak noktalı virgül kullanmak isterseniz o zaman csv.open

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

olarak veya yeni lehçesi oluşturmak ve kaydetmek için ya açıkça sınırlayıcı geçmesi gerekiyor bunun iki durumda da

class excel_semicolon(csv.excel): 
    delimiter = ';' 
register_dialect("excel-semicolon", excel_semicolon) 
, Kayan nokta sayılarının nasıl yazıldığını test etmelisiniz ... İstediğiniz Avrupa formatında yazılmayacağından şüpheliyim (yarıçap olarak virgül ile)

6

excel lehçesi aşağıdaki öznitelikler tarafından belirlenir (Lib/csv.py, line 57 cinsinden):

Bu şekilde yerele bağımlı olduğunu, hiçbir ipucu bakınız
delimiter = ',' 
quotechar = '"' 
doublequote = True 
skipinitialspace = False 
lineterminator = '\r\n' 
quoting = QUOTE_MINIMAL 

- dolayısıyla her zaman varsayılan , alırsınız lehçesi.

Ancak, bu kolayca, örn.

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

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

Elbette kolayca sabitlenir, ancak Python'un excel diyalektini dahil edip edemeyeceğini varsaydım. Doğru olarak = S – orlp

+0

@miku: -1. İkinci ifadenizden sonra, 'csv.excel.delimiter' yerine '', '' yerine '' anlamına gelir. Cevabı @Donkopotamus tarafından okuyun. –

+0

@John, Teşekkürler, düzeltildi. – miku