Python,Docker - “ascii”编解码器无法编码字符

Posted

技术标签:

【中文标题】Python,Docker - “ascii”编解码器无法编码字符【英文标题】:Python, Docker - 'ascii' codec can't encode character 【发布时间】:2019-02-03 13:23:22 【问题描述】:

我编写了一个 python3 脚本,它执行一些网络抓取并将一些信息存储在 CSV 文件中。该脚本在我的计算机上运行良好。当我尝试在 docker 容器上运行脚本时会出现问题。错误似乎在我的代码的这一部分(为了这个问题的目的进一步简化)。

# default CSV module
import csv

# this is how an ACTUAL row looks like in my program, included it in case it was important
row = 'title': 'Electrochemical sensor for the determination of dopamine in presence of high concentration of ascorbic acid using a Fullerene-C60 coated gold electrode', 'url': 'https://onlinelibrary.wiley.com/doi/abs/10.1002/elan.200704073', 'author': 'Goyal, Rajendra Nath and Gupta, Vinod Kumar and Bachheti, Neeta and Sharma, Ram Avatar', 'abstract': 'A fullerene‐C60‐modified gold electrode is employed for the determination of dopamine in the excess of ascorbic acid using square‐wave voltammetry. Based on its strong catalytic function towards the oxidation of dopamine and ascorbic acid, the overlapping voltammetric …', 'eprint': 'http://www.academia.edu/download/3909892/Dopamene.pdf', 'publisher': 'Wiley Online Library', 'year': '2008', 'pages': '757--764', 'number': '7', 'volume': '20', 'journal': 'Electroanalysis: An International Journal Devoted to Fundamental and Practical Aspects of Electroanalysis', 'ENTRYTYPE': 'article', 'ID': 'goyal2008electrochemical'

# the CSV writer object
writer = csv.DictWriter("file.csv", fieldnames=[a, b, c],  dialect='tomysql')

# this is the source of the problem!
writer.writerow(row)

我知道容器只有基本框架,这意味着脚本使用的编码可能不受支持。因此,我将其添加到脚本的开头:(低于通常的 she-bang)

# coding=utf-8

这些是我的 docker 上的语言环境:

$ locale -a

C
C.UTF-8
POSIX
en_US.utf8
es_CR.utf8

我的 PC 上还有更多内容,但这应该不会有太大变化,因为 en_US.utf8 涵盖了所有英语内容,而 es_CR.utf8 涵盖了所有西班牙语内容。 (如果不是全部,我的大部分结果都是英文的。)

我正在使用python3,所以我知道所有字符串都是unicode字符,也许这与问题有关?

$ python3 --version
Python 3.6.5

尽管如此,当我运行我的程序时,只要脚本尝试在控制台上打印该行,我就会收到以下错误消息:

Exception in thread Thread-6:
Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/home/Systematic-Mapping-Engine/sysmapengine/scraper.py", line 100, in build_csv
    writer.writerow(clean_row)
  File "/usr/lib/python3.6/csv.py", line 155, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
UnicodeEncodeError: 'ascii' codec can't encode character '\u2010' in position 262: ordinal not in range(128)

【问题讨论】:

这个问题似乎不是链接问题的重复,因此上面的通知似乎具有误导性。在另一个问题中,问题不是由使用 docker 环境引起的,它的答案并不能解决问题。这里的问题不在于某些随机文件的编码不正确并且需要特殊处理,而是由于某些图像默认值,docker 容器中的任何文件都假定编码错误。可以通过包含 Dockerfile 或图像名称并显示原始 Python 的 open 而不是 csv 模块来改进这个问题。 这个问题绝对不是重复的,我们怎样才能让它不被标记? 投票重新开放;这绝对不是重复的 【参考方案1】:

大多数容器以LANG=C 开头。如果您正在处理 UTF-8,那可能真的很烦人。

只是为了确保您的容器以正确的语言环境开始,在调用 docker 时添加 -e LANG=C.UTF-8

【讨论】:

在 Dockerfile 中:ENV LANG C.UTF-8

以上是关于Python,Docker - “ascii”编解码器无法编码字符的主要内容,如果未能解决你的问题,请参考以下文章

Docker异常docker-compose up throw UnicodeDecodeError: 'ascii' codec can't decode byte 0x(代

DockerSyntaxError: Non-ASCII character ‘xe5‘ in file xxx

Python内置函数之ascii()

python——字符输出ASCII码

python基础--ASCII码

repr. str, ascii in Python