【问题标题】:How to convert cp1252 to UTF-8 when export csv file using python使用python导出csv文件时如何将cp1252转换为UTF-8
【发布时间】:2018-09-10 04:45:46
【问题描述】:

当我尝试导出 CSV 文件时出现 Unicode 错误(网络抓取,我使用的是 Beautifulsoup 并同时导入了 CSV 和 Beautifulsoup)。该代码由完全支持 UTF-8 的 Mac Linux 使用,但我使用的是 Windows。错误显示为

> UnicodeEncodeError Traceback (most recent call last) in () 71
> 'ranking_title': ranking_title, ---> 72 'ranking_category':
> ranking_category}) 73
> 
> ~\Anaconda3\lib\csv.py in writerow(self, rowdict) 154 def
> writerow(self, rowdict): --> 155 return
> self.writer.writerow(self._dict_to_list(rowdict)) 156
> 
> ~\Anaconda3\lib\encodings\cp1252.py in encode(self, input, final) 18
> def encode(self, input, final=False): ---> 19 return
> codecs.charmap_encode(input,self.errors,encoding_table)[0] 20
> 
> UnicodeEncodeError: 'charmap' codec can't encode characters in
> position 299-309: character maps to

适用于 Mac 的原始代码是:

def get_page(url):
    request = urllib.request.Request(url)
    response = urllib.request.urlopen(request)
    mainpage = response.read().decode('utf8')
    return mainpage

我尝试在工作表的开头解码 cp1252 并编码 UTF-8:

def get_page(url):
    request = urllib.request.Request(url)
    response = urllib.request.urlopen(request)
    mainpage = response.read().decode('cp1252').encode('utf8')
    return mainpage

但它不起作用。请帮忙。

【问题讨论】:

  • 看起来问题不在于您如何读取(解码)数据,而在于您如何编写它(编码,参见错误消息)。 get_page 函数看起来不错,但您应该显示打开文件以将 CSV 输出写入其中的代码部分。
  • 你能提供你正在使用的网站的网址吗?
  • @lenz 非常感谢。我会尽快提供。现在我遇到了其他一些随机错误。
  • 抛弃urllib.request。使用requests 模块。它为您完成所有解码,您可以专注于您真正想做的事情。 (当然,您可以使用 urllib 重新实现 requests 所做的所有事情。但是对于初学者,您需要注意 Content-Type 响应标头而不是硬编码单个编码。但是这样做真的是您的目标在这里,还是您真的想下载和使用数据?)
  • @Tomalak 关于requests 让您的生活总体上更轻松当然是正确的。恐怕它不会解决这个特殊问题,因为解码显然成功了(没有UnicodeDecodeError)。我怀疑你 open 没有声明 encoding= 参数的输出文件,所以 Python 默认使用特定于平台的默认编解码器“CP-1252”,它显然不支持数据中的所有字符。

标签: python utf-8 web-scraping beautifulsoup cp1252


【解决方案1】:

当您将数据写入 CSV 输出文件时,您面临的 UnicodeEncodeError 就会出现。 正如错误消息告诉我们的那样,Python 使用不支持数据中包含的字符的“charmap”编解码器。 当您在 Windows 机器上open 一个文件未指定编码参数时,通常会发生这种情况。

在随附的代码文档(评论链接)中,sn -p no. 10,我们可以看到是这样的。 你写道:

with open('wongnai.csv', 'w', newline='') as record:
    fieldnames = ...

在这种情况下,Python 使用依赖于平台的默认编码,在 Windows 机器上通常是某种 8 位编码。 指定支持所有Unicode的编解码器,写入文件应该成功:

with open('wongnai.csv', 'w', newline='', encoding='utf16') as record:
    fieldnames = ...

当然,您也可以使用“utf8”或“utf32”来代替“utf16”。 UTF-8 在 Unix 环境和 Internet 上保存文件非常流行,但如果您打算稍后用 Excel 打开 CSV 文件,您可能会遇到一些麻烦,让应用程序正确显示数据。 一个更适合 Windows(但在技术上非标准)的解决方案是使用“utf-8-sig”,它在文件的开头添加一些半魔术字符,以帮助 Windows 程序理解它是 UTF-8。

【讨论】:

  • 它成功了!!!!非常感谢。我非常感谢您的时间和精力。我不能感谢你! :D
  • 不用担心。我很高兴它有所帮助。
猜你喜欢
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 2014-05-06
  • 1970-01-01
  • 2013-09-12
相关资源
最近更新 更多