2016-04-09 25 views
0

EDIT: @ayhan için teşekkürler çözüldü. Polonya'dan iseniz, ayırıcı olarak virgül yerine noktalı virgül kullanın.csv.writer içeriğinin bir hücreye yazılması

list = [['edytor poranka PN', '1/04/2016', '15:00'], ['edytor PN 2', '2/04/2016', '08:30'], ['edytor PN noc', '3/04/2016', '22:00']] 

csv.writer bir hücre yerine 3 ayrı olanlar her bir liste yazıyor:

Şöyle listelerinin bir listesi var.

Benim kod şöyle görünür: Ben de bu yöntemi denedim

with open('file.csv', 'w') as f: 
    writer = csv.writer(f, delimiter=',', quoting=csv.QUOTE_MINIMAL) 
    writer.writerows(list) 

:

for i in list: 
    writer.writerow(i) 

Ve aynı zamanda çalışmaz. Diğer meselem, her satırın fazladan boş bir satırla ayrılması ve bundan nasıl kurtulacağımı bilmem. Benzer sorular olduğunu biliyorum ama benim için çözüm yok.

cevap

1

Her bir yinelemede fazla satırın eklenmesini önlemek için yeni satırı belirtmeniz gerekir. Ayrıca, list değişkeninizi adlandırmak, yerleşik bir tür olduğu için kötü bir fikirdir.

with open('file.csv', 'w', newline='') as f: 
    writer = csv.writer(f) 
    for a_list in lists: 
     writer.writerow(a_list) 
+0

İyi öneri yok, ancak OP zaten listede i için 'çalıştığını söyledi:' 'writer.writerow (i)'. – martineau

+0

OP bunu denediklerini ancak her satırın boş bir satırda ayrıldığını söyledi. Bu yüzden çalışmıyordu. Yeni satırlar 'newline' parametresi – Pythonista

+0

Teşekkürler ayarlanmadığı için eklenir. newline boş satırlarla yardımcı oldu, ancak yine de tek bir hücrede. –

1

Avcının kod burada benim için çalıştı ABD, ama Polonya, benim, Windows Bölge ve Dil ayarlarını değiştirdiyseniz öyle değil ve ben senin sorunu yeniden nihayet güçlü oldu. Bu @ayhan göre

çünkü okuma ve , Polonya'da olduğu gibi ondalık ayırıcı (ondalık işareti) olarak kullanılır yerellerde CSV dosyalarını kaydederken bu sınırlayıcı olmaya ; beklediğini Excel'de bir hata olduğunu (ve dünyanın geri kalanının çoğu). Muhtemelen

en kolay iş-etrafında csv.writer nesne oluşturmak aşağıda gösterildiği gibi sadece Excel bölgenizdeki beklediği sınırlayıcıyı belirtmek geçerli: file.csv ait

#!/usr/bin/env python3 

import csv 

list_of_lists = [['edytor poranka PN', '1/04/2016', '15:00'], 
       ['edytor PN 2', '2/04/2016', '08:30'], 
       ['edytor PN noc', '3/04/2016', '22:00']] 

with open('file.csv', 'w', newline='') as f: 
    writer = csv.writer(f, delimiter=';') 
    for sublist in list_of_lists: 
     writer.writerow(sublist) 

İçeriği Komut dosyasını çalıştırdıktan sonra:

edytor poranka PN;1/04/2016;15:00 
edytor PN 2;2/04/2016;08:30 
edytor PN noc;3/04/2016;22:00 

Daha sonra, Microsoft Excel 2013'te açtığımda, Windows Formatı ve Konumum Windows Bölge ve Dil kontrol panelinde "Polonya" olarak ayarlanmışsa, aşağıdakileri görüyorum (şimdi doğru):

screenshot of file after opening it in excel 2013

Güncelleme

bir çakışma olursa dinamik komut geçerli yerel ayarlarına göre kullanılacak ne sınırlayıcı belirlemek ve farklı bir şey almak olacaktır yapmanın bir yolu - hardcoding rağmen ;, ondalık işareti olarak kullanmayan herhangi bir yerde çalışmalıdır (ve bunu yapan birinin farkında değilim).

Sorunun nedenini biliyor olduğumuzdan beri, for loop Slayer'ı kullanıma sunup, writerows() kullanılan kodunuzun sürümüne geri döneceğim.

import csv 
import locale 

# Chose an Excel compatible csv delimiter. 
locale.setlocale(locale.LC_ALL, '') 
DELIMITER = ';' if locale.localeconv()['decimal_point'] == ',' else ',' 

list_of_lists = [['edytor poranka PN', '1/04/2016', '15:00'], 
       ['edytor PN 2', '2/04/2016', '08:30'], 
       ['edytor PN noc', '3/04/2016', '22:00']] 

with open('file.csv', 'w', newline='') as f: 
    writer = csv.writer(f, delimiter=DELIMITER) 
    writer.writerows(list_of_lists) 
+0

benim için çalışmıyor. Excel 2010 kullanıyorum. Bu bir sorun olabilir mi? –

+1

İşletim sisteminizin bölgesel ayarları bir sorun olabilir. Varsayılan sınırlayıcı virgül değilse, Excel bunların tümünü aynı hücrede gösterir. – ayhan

+0

Sanırım Excel 2010'u kullanmanızın sebebi olabilir (ancak bundan şüpheniz olabilir). Csv dosyaları için varsayılan sınırlayıcı her zaman [belgeler] (https://docs.python.org/3/library/csv.html#dialects-and-formatting-parameters) (bkz. 'Dialect.delimiter')' e göre virgüllerdir. ve işletim sisteminizin bölgesel ayarlarından etkilenmez. – martineau

İlgili konular