【问题标题】:S3 file to local using luigi raises UnicodeDecodeError使用 luigi 到本地的 S3 文件引发 UnicodeDecodeError
【发布时间】:2016-02-08 08:16:34
【问题描述】:

我正在使用以下代码将pdf 文件复制到本地:

with self.input_target().open('r') as r:
    with self.output_target().open('w') as w:
       for line in r: 
           w.write(line) 

基于this问题(种类)

但是当我执行该代码时,我得到以下信息:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 11:
      invalid continuation byte

我尝试了另一种方法,但效果不佳:

   with self.input_target().open('r') as r, self.output_target().open('w') as w:                                                                                                                        
       w.write(r.read())                         

正确的做法是什么?

【问题讨论】:

  • 你能准备一个最小的例子来重现它和 pdf 吗?

标签: python python-3.x amazon-s3 luigi


【解决方案1】:

另一种选择是使用格式 kwarg luigi.format.Nop 到 Target 以指示它是正在读取的二进制文件。

例如

def output(self):
    return LocalTarget(target, format=luigi.format.Nop)

【讨论】:

    【解决方案2】:

    您似乎在处理二进制文件,就好像它是文本一样 - 但事实并非如此。你可能需要做这样的事情:

    with self.input().open('r') as i, self.output().open('w') as o:
        o.write(i.read())
    

    (未测试!)

    另外,我认为您可能会发现这个答案很有用:Python writing binary files, bytes

    【讨论】:

    • 谢谢你的回答,但我没有工作。同样的错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 11: invalid continuation byte:(我会更新问题
    • 试试open('rb')open('wb')
    • 你知道pdf文件的编码吗?如果是 Latin-1,那么您应该这样阅读:self.input_target().open('r', encoding="ISO-8859-1")
    • luigi 不支持 encoding 参数
    【解决方案3】:

    我结束了使用 luigi.s3.S3Client 和方法 get 将二进制文件从/复制到 s3

    代码片段:

    进口路易吉

    class ATask(luigi.Task):
        s3_path = luigi.Parameter()
        local_path = luigi.Parameter()
        ...
    
        def run(self):
            client = luigi.s3.S3Client()
            client.get(s3_path, local_path)  ## This gets the file
            ...
    

    我认为根本原因是luigi 使用boto 从/向s3 获取/放入文件。 (在源代码中可以看到)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多