2016-11-07 20 views
0

以下のコードは、ディレクトリ、開いているファイル、変換などを経由する必要があります。セルが空の場合、結果のCSVファイルはその代わりにNoneを出力します。Python:Openpyxlは空のセルに "None"を出力します

なぜこれを修正できますか? OpenPyXlが空のセル(値なしの空の手段、フォント、境界など)を格納しない

import os 
from openpyxl import load_workbook 
import csv 

for subdir, dirs, files in os.walk("C:\Users\Alan\Downloads\Knowledge\HOW DO I"): 
    for file in files: 
     filepath = subdir + os.sep + file 

     wb = load_workbook(filename=filepath) 
     sh = wb.active 
     your_csv_file = open(filepath.replace(".xlsx","")+'_csv.csv','wb') 
     wr = csv.writer(your_csv_file,quoting=csv.QUOTE_ALL) 

     for rownum in sh.iter_rows(): 
      wr.writerow([unicode(val.value).encode('ascii','ignore') for val in rownum]) 

     your_csv_file.close() 
+0

修正:Windowsのパスに二重のバックスラッシュを使用します。 'os.walk(" Cを:\\ Users \\ Alan \\ Downloads \\ Knowledge \\どうすれば ")'。 –

+0

単体でうまく動作します – pee2pee

答えて

1

おかげ。ワークシートからセルを取得すると、Noneの値を持つ新しい空のセルが動的に作成されます。

ないCell()コンストラクタを呼び出す​​使用Worksheet.cell()メソッドの現在の実装(V2.4.0)。

あなたが「空」のセルを処理するようにコードを変更する必要があります。

for rownum in sh.iter_rows(): 
    values = [(u"" if cell.value is None else unicode(cell.value)) 
       for cell in rownum] 
    wr.writerow([value.encode('ascii', 'ignore') for value in rownum]) 

注:あなたは、おそらくWindowsユーザーのためのCSVファイルにデータをエクスポートするので、あなたのような、より便利なエンコーディングを選択できます。 cp1252

+0

ありがとうございます - 少し修正しなければなりませんでしたが、今すぐ動作します – pee2pee

-1

なぜですか?なぜなら、「空」を「なし」と同じに見えるからです。でも、私は 'NA' をしたいので、私のようなものがあります:

def _transmap(dat): 
    transmap = { 
     # empty cells are going to be empty strings 
     None: 'NA', 
     # workaround for bug in openpyxl 
     # https://bitbucket.org/openpyxl/openpyxl/issues/674/ 
     dt.datetime(1899, 12, 30, 0, 0): dt.time(0, 0), 
     dt.datetime(1899, 12, 31, 0, 0): dt.datetime(1900, 1, 1, 0, 0), 
    } 
    return transmap[dat] if dat in transmap else dat 

をして、あなたのようなものWITEます:

for rownum in sh.iter_rows(): 
      wr.writerow([unicode(_transmap(val.value)).encode('ascii','ignore') for val in rownum]) 
+0

空白は空/ヌルを意味するので – pee2pee

+0

味の問題。私のフィールドでは、空の文字列は、空のセルとしてエンコードされた「データなし」とは異なる意味を持っています。私の答えが間違っていますか? – hvwaldow