Python, Docker - кодек 'ascii' не может закодировать символ

1

Я написал сценарий python3, который выполняет некоторые ловушки и хранит некоторую информацию в CSV файле. Скрипт отлично работает на моем компьютере. Проблема возникает, когда я пытаюсь запустить скрипт в контейнере докеров. Похоже, что ошибка в этой части моего кода (упрощена далее для целей этого вопроса).

# 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

Это локали на моем докере:

$ locale -a

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

У меня больше на моем компьютере, но это не должно сильно меняться, так как en_US.utf8 охватывает все материалы английского языка, а es_CR.utf8 охватывает все испанские вещи. (большинство, если не все, моих результатов написаны на английском языке.

Я использую python3, поэтому я знаю, что все строки являются символами юникода, возможно, это связано с проблемой?

$ 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)
  • 2
    Этот вопрос не является дубликатом связанного вопроса, и поэтому приведенное выше уведомление вводит в заблуждение. В другом вопросе проблема не вызвана использованием среды докера, и ее ответы не решают проблему. Проблема здесь не в том, что какой-то случайный файл имеет неправильную кодировку и требует особой обработки, а в том, что ЛЮБОЙ файл в контейнере Docker принял неправильную кодировку из-за некоторых значений по умолчанию. Этот вопрос может быть улучшен включением Dockerfile или имени изображения и отображением open Python вместо модуля csv .
Теги:
csv
docker
python-3.x

1 ответ

2
Лучший ответ

Большинство контейнеров начинаются с набора LANG=C Это может быть очень неприятно, если вы имеете дело с UTF-8.

Чтобы убедиться, что ваш контейнер начинается с правильной локали, добавьте -e LANG=C.UTF-8 при вызове докера.

  • 0
    Большое спасибо! Это сработало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню