Python:Openpyxl 为空单元格输出 "None"
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()
构造函数而没有 value.
您需要更改代码以处理 "empty" 个单元格:
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
.
为什么?因为把"empty"等同于"None"似乎是对的。不过我想要 '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])
下面的代码应该遍历目录、打开文件、转换等。问题是当单元格为空时,生成的 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()
构造函数而没有 value.
您需要更改代码以处理 "empty" 个单元格:
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
.
为什么?因为把"empty"等同于"None"似乎是对的。不过我想要 '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])