2016-04-09 4 views
0

EDIT:@ayhanに感謝しています。あなたがポーランド出身の場合は、区切り記号としてコンマの代わりにセミコロンを使用します。csv.writerがすべての内容を1つのセルに書き込む

私はこのようになりますリストのリストがあります:

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は、3つの別々のものに代わり、一つのセルに各リストを書き込みます。

私のコードは次のようになります。私もこの方法で試してみた

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) 

をそしてそれはまた、動作しません。私の他の問題は、各行が余分な空行で区切られており、それを取り除く方法がわかりません。私は同様の質問があることを知っていますが、解決策は私のために働いていません。

答えて

1

各繰り返しで余分な行が追加されないように、改行を指定する必要があります。変数listの名前も、組み込みのタイプなので、悪い考えです。スレイヤーのコードはここに私のために働いた

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

良い提案ですが、OPは既に「i in list:」、「writer.writerow(i)」を試していると言いました。 – martineau

+0

OPはこれを試してみたが、各行は空白の行で区切られていた。それがなぜ機能していなかったのか。 'newline'パラメータを設定していないため、新しい行が追加されます – Pythonista

+0

ありがとうございます。改行は空の行を助けましたが、それはまだ1つのセルにすべてあります。 –

1

は米国ですが、私はポーランドに私のWindowsの地域と言語の設定を変更した場合、あなたの問題を再現することが最終的にできたではないと私ありません。

この@ayhanによればので、それは,は、例えば、それがポーランドであるとして小数セパレータ(小数点)として使用されるロケールでCSVファイルを読み出して保存するとき;はデリミタであることが期待Excelのバグであります(そして世界のほとんどの地域で)。

あなたがcsv.writerオブジェクトを作成するときに、以下のようにおそらく最も簡単な回避策はただ、Excelがお住まいの地域に期待する区切り文字を指定された:スクリプトを実行した後file.csv

#!/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) 

内容:

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

その後、Windowsの地域と言語のコントロールパネルで、Windowsのフォーマットと場所を「ポーランド」に設定して、Microsoft Excel 2013で開くと、次のようになります(現在は正しい):

screenshot of file after opening it in excel 2013

更新

それを動的に行う方法は、スクリプトが現在のロケール設定に基づいて使用し、競合があるかどう違うものを選ぶためにどのような区切り文字を決定持っているだろう - ハードコーディングするが、 ;はそれを小数点として使用しない場所であれば動作します(そして私はそれを認識しません)。

問題の原因を知ったので、Slayerが紹介したforループを取り出して、writerows()を使用したコードのバージョンに戻ります。

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

は私のためには機能しません。私は2010年にExcelを使用しています。これが問題なのでしょうか? –

+1

オペレーティングシステムの地域設定が問題になることがあります。既定の区切り文字がカンマではない場合、Excelはすべて同じセルに表示します。 – ayhan

+0

私はあなたがExcel 2010を使用している理由が考えられると思いますが、それは疑わしいです。 csvファイルのデフォルトの区切り文字は、[documentation](https://docs.python.org/3/library/csv.html#dialects-and-formatting-parameters)(「Dialect.delimiter」を参照)に従って常にカンマで区切りますオペレーティングシステムの地域設定の影響を受けません。 – martineau

関連する問題