[英]Python: Openpyxl outputs “None” for empty cells
下面的代碼應遍歷目錄,打開文件,轉換等。問題是當單元格為空時,生成的CSV文件將在其位置輸出“ 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()
OpenPyXl不存儲空單元格(空意味着沒有值,字體,邊框等)。 如果從工作表中獲得一個單元格,它將動態創建一個新的空單元格,其值為None
。
Worksheet.iter_rows()
的當前實現(v2.4.0)使用Worksheet.cell()
方法,該方法調用沒有值的 Cell()
構造函數 。
您需要更改代碼以處理“空”單元格:
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
。
為什么? 因為將“空”與“無”等同是正確的。 我想要'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
然后您會想像:
for rownum in sh.iter_rows():
wr.writerow([unicode(_transmap(val.value)).encode('ascii','ignore') for val in rownum])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.