2016-11-07 75 views
0

下面的代碼應該通過目錄,打開文件,轉換等等。事情是當單元格爲空時,生成的CSV文件在其位置輸出「None」。Python:Openpyxl爲空單元輸出「None」

任何原因,可以解決這個問題嗎?

由於

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 \\ How Do I「)'。 –

+0

它工作正常單 – pee2pee

回答

1

OpenPyXl不空細胞儲存(空手段沒有值,字體,邊框等)。如果您從工作表中獲取單元格,它會動態創建一個新值爲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]) 

注:因爲你的數據導出爲CSV文件,大概是Windows用戶,你可以選擇像一個更有用的編碼方式: 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