【问题标题】:How to correct the encoding while creating excel file from 'utf-8' data using python如何在使用 python 从“utf-8”数据创建 excel 文件时更正编码
【发布时间】:2016-04-23 20:56:47
【问题描述】:

我正在尝试使用 python 从字典列表中创建一个 excel 文件。最初我收到编码不当的错误。所以我将我的数据解码为“utf-8”格式。现在创建 excel 后,当我检查每个字段中的值时,它们的格式已更改为纯文本。以下是我在使用 sn-p 代码执行此活动时使用的 stpes。

1.>我在创建 excel 文件时遇到编码不正确的错误,因为我的数据中有一些 'ascii' 值。错误sn-p:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)

2.>为了消除编码不当的错误,我在读取输入 csv 文件时插入了一个 decode() 函数。解码为“utf-8”时的代码片段:

data = []
with open(datafile, "r") as f:
    header = f.readline().split(',')
    counter = 0
    for line in f:
        line = line.decode('utf-8')

        fields = line.split(',')
        entry = {}
        for i,value in enumerate(fields):
            entry[header[i].strip()] = value.strip()
        data.append(entry)
        counter += 1

return data

3.>插入 decode() 函数后,我使用以下代码创建了我的 excel 文件:

ordered_list= dicts[0].keys() 

wb=Workbook("New File.xlsx")
ws=wb.add_worksheet("Unique")

first_row=0
for header in ordered_list:
   col=ordered_list.index(header)
   ws.write(first_row,col,header) 

row=1
for trans in dicts:
   for _key,_value in trans.items():
       col=ordered_list.index(_key)
       ws.write(row,col,_value)
   row+=1 #enter the next row
wb.close()

但是在创建 excel 之后,excel 的每个字段中的所有值都是文本格式而不是它们的原始格式(一些日期时间值、十进制值等)。如何确保数据格式不会与我使用输入 csv 文件读取的输入数据格式发生变化?

【问题讨论】:

  • 请将您失败的程序缩减为一个简短、完整的程序来演示错误。请完整发布该简短完整的程序,以及对您观察到的结果和您期望的结果的描述。请参阅How to Askminimal reproducible example 了解更多信息。
  • @Robᵩ 我已经编辑并以结构化的方式提出了我的问题。如果您认为它仍然不清楚,请让我知道这个问题。我会尽量提供尽可能详细的信息。
  • Python 2.x 还是 Python 3.x?您使用的是哪个 Excel 库?打开pyxl?
  • @AlastairMcCormack 我正在使用 Python 2.x。最初我使用 Xlsxwriter 写入 excel 工作簿。然后,在将输入的 csv 文件转换为 xlsx 工作表后,我使用 Xlrd 库来读取和写入 excel。感谢您的帮助!
  • xlrd 适用于旧式 .xls,您的代码显示您正在从 CSV 读取数据。那你现在用的是哪一个?

标签: python excel dictionary utf-8 ascii


【解决方案1】:

读取文本文件时,您应该将编码传递给open(),以便自动为您解码。

Python 2.x:

with io.open(datafile, "r", encoding="utf-8") as f:

Python 3.x:

with open(datafile, "r", encoding="utf-8") as f:

现在读取的每一行都是一个 Unicode 字符串。

在阅读 CSV 文件时,您可能需要考虑 CSV 模块,它可以理解 CSV 方言。它将自动返回每行的字典,由标题键入。在 Python 3 中,它只是 csv 模块。在 Python 中,CSV 模块被非 ASCII 破坏。使用https://pypi.python.org/pypi/unicodecsv/0.13.0

一旦你有了干净的 Unicode 字符串,你就可以继续存储数据了。

Excel 格式要求您告诉它您存储的数据类型。如果将时间戳字符串放入单元格中,它会认为它只是一个字符串。如果您插入一个整数字符串,同样适用。

因此,在添加到工作簿之前,需要在 Python 中转换值类型。

将十进制字符串转换为浮点数:

 my_decimal = float(row["height"])
 ws.write(row,col,my_decimal)

从字符串创建日期时间字段。假设字符串是“Jun 1 2005 1:33PM”:

date_object = datetime.strptime(my_date, '%b %d %Y %I:%M%p')
ws.write(row,col,date_object)

【讨论】:

  • 在读取输入文件时是否需要使用 encoding='utf-8' 或 decode('utf-8') ?我已经尝试过使用 [encoding='utf-8'] 并且它向我抛出了语法错误。
  • 如果用encoding="utf-8"打开文件,就不再需要在每一行都调用decode()了。
猜你喜欢
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2017-09-04
  • 2020-05-05
  • 2013-06-11
相关资源
最近更新 更多