Python、Docker - 'ascii' 编解码器无法编码字符

标签 python python-3.x csv docker

我写了一个 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)

最佳答案

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

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

关于Python、Docker - 'ascii' 编解码器无法编码字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52065842/

相关文章:

python - 为什么即使我没有在函数中点击 yield 关键字,我仍然会收到一个生成器

python - 立即将用户输入输出到控制台

python - 逗号 csv 文件后的最后一个值

javascript - 将参数传递给 q.defer (d3.csv)

python - Pandas groupby 和 bool 选择

python - pyodbc UPDATE 抛出异常

python - 如何复制discord.py中 channel 的所有消息

python - 将 csv 读入 pandas,其中 *csv 行的第一个/索引单元格内有逗号,而不更改值

python - 验证索引的列表问题

java - 如何仅使用 apache camel 从 http 读取一次 csv 文件?