【问题标题】:Failing to Convert Files from CSV to Excel无法将文件从 CSV 转换为 Excel
【发布时间】:2020-03-19 10:53:03
【问题描述】:

正在尝试将 csv 文件的文件夹列表转换为 excel。不幸的是,它们中的大多数都不起作用,我也遇到了以下错误。当我通过 excel 前端做同样的事情时,它可以很好地从 csv 中保存它们。有什么想法我可能做错了吗?

import os
import glob
import csv
import openpyxl # from https://pythonhosted.org/openpyxl/ or PyPI (e.g. via pip)

for csvfile in glob.glob(os.path.join('.', '*.csv')):
    wb = openpyxl.Workbook()
    ws = wb.active
    with open(csvfile, 'rb') as f:
        reader = csv.reader(f)
        for r, row in enumerate(reader, start=1):
            for c, val in enumerate(row, start=1):
                ws.cell(row=r, column=c).value = val
    wb.save(csvfile + '.xlsx')

得到以下错误:

(最近一次通话最后): 文件“C:\Users\test\Documents\ConvertCSVtoXLSX\2007+.py”,第 14 行,在 ws.cell(row=r, column=c).value = val

文件“C:\Python27\ArcGIS10.7\lib\site-packages\openpyxl\cell\cell.py”,第 272 行,值 self._bind_value(value)

文件“C:\Python27\ArcGIS10.7\lib\site-packages\openpyxl\cell\cell.py”,第 229 行,在 _bind_value value = self.check_string(value)

文件“C:\Python27\ArcGIS10.7\lib\site-packages\openpyxl\cell\cell.py”,第 180 行,在 check_string value = unicode(value, self.encoding)

UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 30: invalid start byte

【问题讨论】:

  • 尝试使用'r' 而不是'rb'
  • 这个我试过了,好像还是不行。我还注意到,使用脚本转换与直接使用 excel16 保存文件时文件大小不同。这可能是因为脚本有限

标签: python excel python-2.7 csv character-encoding


【解决方案1】:

看起来 pyopenxl 预计它将接收编码为 UTF-8 的数据,但您传递给它的数据有一些其他编码 - 可能是 Windows cp* 代码页之一。您可以通过调用locale.getpreferredencoding 来确定系统的默认编码。假设它是cp1252

在回溯中,我们可以看到这是失败的行:

unicode(value, self.encoding)

导致此错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 30: invalid start byte

pyopenxl 正在尝试解码它从 UTF-8 接收到的值,但失败了;我们可以通过在将值传递给 pyopenxl 之前重新编码来解决这个问题。

for c, val in enumerate(row, start=1):
    fixed_val = unicode(val, 'cp1252').encode('utf-8')
    ws.cell(row=r, column=c).value = fixed_val

如果您的某些文件可能被编码为 UTF-8,而某些文件可能以您系统的默认编码编码,您可能需要将原始分配包装在 try/except 块中

for c, val in enumerate(row, start=1):
    try:
        ws.cell(row=r, column=c).value = val
    except UnicodeDecodeError:
        fixed_val = unicode(val, 'cp1252').encode('utf-8')
        ws.cell(row=r, column=c).value = fixed_val

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2017-02-02
    • 2021-07-21
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多