Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法将文件从CSV转换为Excel_Python_Excel_Python 2.7_Csv_Character Encoding - Fatal编程技术网

Python 无法将文件从CSV转换为Excel

Python 无法将文件从CSV转换为Excel,python,excel,python-2.7,csv,character-encoding,Python,Excel,Python 2.7,Csv,Character Encoding,正在尝试将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文件的文件夹列表转换为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(行=r,列=c).value=val

文件“C:\Python27\ArcGIS10.7\lib\site packages\openpyxl\cell\cell.py”,第272行,值 自我约束值(值)

文件“C:\Python27\ArcGIS10.7\lib\site packages\openpyxl\cell\cell.py”,第229行,在\u bind\u值中 值=自我检查字符串(值)

文件“C:\Python27\ArcGIS10.7\lib\site packages\openpyxl\cell\cell.py”,第180行,检查字符串 value=unicode(值,自编码)

UnicodeDecodeError:“utf8”编解码器无法解码位置30中的字节0xa0:无效的开始字节


看起来pyopenxl期望它将接收编码为UTF-8的数据,但是您传递给它的数据有其他编码——可能是Windows cp*代码页之一。您可以通过调用来确定系统的默认编码。让我们假设它是
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

试着用
'r'
代替
'rb'
我已经试过了,似乎还是不起作用。我还注意到,使用脚本转换文件与直接使用excel16保存文件时,文件大小不同。这可能是因为脚本的限制吗