2

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

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

这是基于这个问题(种类)

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

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())                         

正确的做法是什么?

4

3 回答 3

1

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

例如

def output(self):
    return LocalTarget(target, format=luigi.format.Nop)
于 2019-11-01T00:10:20.460 回答
0

似乎您正在处理一个二进制文件,就好像它是文本一样 - 但事实并非如此。您可能需要执行以下操作:

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

(未经测试!)

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

于 2015-11-07T08:07:43.567 回答
0

我结束了使用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用于botos3. (正如您在源代码中看到的那样)

于 2015-11-12T01:20:48.213 回答