python - 如何使用 python 脚本提取包含多个部分的 zip 文件以在 Google Cloud Function 中运行
问题描述
再会,
我对 python 语言非常陌生,我被分配构建一个 python 脚本,该脚本将从电子邮件中获取所有附件文件。附件文件有一个多磁盘部分(.zip、.z01、.z02 等)。使用 zipfile 模块可以轻松提取没有任何多磁盘部分的普通 zip 文件。此代码有效:
password = get_data()
files = [f for f in os.listdir(source_file_name) if isfile(join(source_file_name, f))]
for file in files:
if file.endswith('.zip'):
file_name_split = file.split("_")
resource_name = file_name_split[0]
pswd = password[resource_name]
if resource_name not in listdir('extracted/'):
zip_ref = zipfile.ZipFile('attachments/' +file)
zip_ref.setpassword(pwd = bytes(pswd, 'utf-8'))
zip_ref.extractall('extracted')
zip_ref.close()
os.unlink(source_file_name + file)
但我不能在多磁盘文件中使用该代码,因为 zip 文件模块不支持带有附加注释的 ZIP 文件,或多磁盘 ZIP 文件,如 Zip 文件模块上的文档所述。我在谷歌搜索替代方案,并通过使用 python 子进程模块来使用 7z 应用程序。这是我的代码。
zip_exe = '"C:/Program Files/7-Zip/7z.exe"' + ' x ' '"' + tmp_folder + 'sample.zip' '"'
subprocess.Popen(zip_exe, shell = True, cwd = tmp_extracted_folder)
这在我的本地使用我的桌面 Windows 10 没有任何问题。但我想知道,我怎样才能把这个脚本放在谷歌云功能上?我m not sure that this will work easily by just putting on this script. Do I need to install 7z application on cloud function? I
不确定。你们知道这是否可行吗?我需要帮助,我被这个应用程序卡住了。
如果有其他解决方法,请告诉我。先感谢您。
解决方案
您无法在 Cloud Functions 上安装软件,因为它们不允许您在服务器级别进行交互,因为它是一个无服务器平台,仅执行由事件触发的单一用途功能。
如果您选择使用 7zip 应用程序的方法,则必须使用计算引擎为您的应用程序创建一个服务器实例,但是,这会为您的项目产生服务器成本,我认为这不是您的最佳解决方案问题。
您可以做的是使用与 ZipFile 不同的 Python 库以编程方式解压缩它们,这将在云函数中运行。我个人建议您使用 pyunpack,因为它是我为 Python 找到的最完整的解压缩库。您可以在此链接中查看它的文档,其中包含有关如何实现它的说明和示例,您还可以尝试libarchive和lmza(取决于您的 python 版本)。
注意:对于 pyunpack,您还需要导入patool,这是它用来解压文件的“引擎”,否则它将仅依赖 ZipFile 并且无法正常工作。
希望这可以帮助。
推荐阅读
- java - MySql 的行数并插入到计数的表中
- android - FLutter 应用在 Nougat 7.0 上停止
- bash - 自动化 ssh 响应
- python - django-MPTT 下钻模板
- javascript - 如何将外部数组加载到 jquery 变量中?
- ios - 获取 json 响应但无法解析到标签
- c# - 数据类型 image 和 varbinary(max) 在 equal to 运算符中不兼容
- react-native - 点击托盘中的推送通知警报后导航
- enums - Java 8:ZonedDateTime 将不支持 enum Month,但它将接受包含 enum Month 的 DataTime 对象
- angular - 如何为 kendo-chart-category-axis-item-labels 设置文本值