"UnicodeEncodeError: 'latin-1' codec can't encode character, ordinal not in range" on GCS upload_object_via_stream

オープン
#1,802 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
32/100
issue の種類
バグ
明瞭さ
説明が足りない
活発さ
停滞
技術スタック
google-cloud, python
領域
cloud

調査の方向性

libcloud/storage/base.py の upload_object_via_stream と、libcloud/storage/drivers/s3.py の S3 ドライバーパスから始め、続いて libcloud/common/base.py と libcloud/http.py を通るリクエスト準備を追跡します。報告されている Python およびコンテナー環境で、Latin-1 に含まれない文字を含む CSV を使って失敗を再現します。完了の条件は、アップロードがそのような CSV の内容を UnicodeEncodeError なしで処理し、失敗するパスのリグレッションテストカバレッジを含むことです。

索引モデルが issue の本文から書いたものです。

説明

Summary

I'm trying to upload some CSV files to GCS using libcloud, today I this error:

UnicodeEncodeError: 'latin-1' codec can't encode character '\u201c' in position 628: ordinal not in range(256)

Detailed Information

The encode character and position change with each run, even though the files don't change. I'm not sure what's causing that, CSV files are basically plaintext.

Here's the full stack (some internal code ommitted):

Traceback (most recent call last):
  [...]
    self.__container.upload_object_via_stream(stream, name)  # type: ignore
  File "/usr/local/lib/python3.8/site-packages/libcloud/storage/base.py", line 227, in upload_object_via_stream
    return self.driver.upload_object_via_stream(
  File "/usr/local/lib/python3.8/site-packages/libcloud/storage/drivers/s3.py", line 843, in upload_object_via_stream
    return self._put_object(
  File "/usr/local/lib/python3.8/site-packages/libcloud/storage/drivers/s3.py", line 1007, in _put_object
    result_dict = self._upload_object(
  File "/usr/local/lib/python3.8/site-packages/libcloud/storage/base.py", line 874, in _upload_object
    response = self.connection.request(
  File "/usr/local/lib/python3.8/site-packages/libcloud/common/base.py", line 659, in request
    return request_to_be_executed(
  File "/usr/local/lib/python3.8/site-packages/libcloud/common/base.py", line 678, in _retryable_request
    self.connection.prepared_request(
  File "/usr/local/lib/python3.8/site-packages/libcloud/http.py", line 260, in prepared_request
    self.response = self.session.send(
  File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 645, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/adapters.py", line 440, in send
    resp = conn.urlopen(
  File "/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 703, in urlopen
    httplib_response = self._make_request(
  File "/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 398, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 239, in request
    super(HTTPConnection, self).request(method, url, body=body, headers=headers)
  File "/usr/local/lib/python3.8/http/client.py", line 1256, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.8/http/client.py", line 1302, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.8/http/client.py", line 1251, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.8/http/client.py", line 1040, in _send_output
    for chunk in chunks:
  File "/usr/local/lib/python3.8/http/client.py", line 999, in _read_readable
    datablock = datablock.encode("iso-8859-1")
UnicodeEncodeError: 'latin-1' codec can't encode character '\u2019' in position 5251: ordinal not in range(256)

I'm running this from inside a k8s pod in a GKE cluster, trying to write to a GCS bucket.

apache-libcloud version: 3.5.1
python version: 3.8.15
pod image: python:3.8-slim

I'm not sure what are the steps to reproduce it. It's a CSV file generated by pulling some BigQuery schema metadata. It works locally, but when I ran it in the pod it raised this error.

主要言語
Python
スター
2.1k
フォーク
935
平均マージ
5日 3時間
マージ済み PR(30日)
15

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

apache/libcloud のほかの issue

apache/libcloud の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。