在本地创建 zipfile 并从 s3 写入文件
Create zipfile at local and write files from s3
我正在我的本地机器上创建一个 zip 文件并想从 s3 写入文件。到目前为止,我无法做到这一点。这是我同时拥有的。
import os
import zipfile
from fs import open_fs
fs = open_fs(os.getenv('s3_sample_folder'))
file_names = file_names() #list of file names
with zipfile.ZipFile('zipfile.zip', mode='w') as zf:
for file in file_names:
with fs.open('/'+file, 'rb') as remote_file:
content = remote_file.read()
zf.write(content, basename(content))
ZipFile.write
方法接受文件名,而不是文件内容。您应该使用 ZipFile.writestr
方法来将文件内容写入 zip 文件:
zf.writestr(file, content)
由于您使用的是 PyFilesystem,因此您可以打开 S3 文件系统和 Zip 文件系统,然后使用 copy_file 在它们之间进行复制。
像下面这样的东西应该可以工作:
import os
from fs import open_fs
from fs.copy import copy_file
with open_fs(os.getenv('s3_sample_folder')) as s3_fs:
with open_fs('zip://zipfile.zip', create=True) as zip_fs:
for filename in file_names():
copy_file(s3_fs, filename, zip_fs, filename)
我正在我的本地机器上创建一个 zip 文件并想从 s3 写入文件。到目前为止,我无法做到这一点。这是我同时拥有的。
import os
import zipfile
from fs import open_fs
fs = open_fs(os.getenv('s3_sample_folder'))
file_names = file_names() #list of file names
with zipfile.ZipFile('zipfile.zip', mode='w') as zf:
for file in file_names:
with fs.open('/'+file, 'rb') as remote_file:
content = remote_file.read()
zf.write(content, basename(content))
ZipFile.write
方法接受文件名,而不是文件内容。您应该使用 ZipFile.writestr
方法来将文件内容写入 zip 文件:
zf.writestr(file, content)
由于您使用的是 PyFilesystem,因此您可以打开 S3 文件系统和 Zip 文件系统,然后使用 copy_file 在它们之间进行复制。
像下面这样的东西应该可以工作:
import os
from fs import open_fs
from fs.copy import copy_file
with open_fs(os.getenv('s3_sample_folder')) as s3_fs:
with open_fs('zip://zipfile.zip', create=True) as zip_fs:
for filename in file_names():
copy_file(s3_fs, filename, zip_fs, filename)