我正在编写一个脚本,用于在 Windows 上通过 python3 提取 zip/tar 文件。它正常工作正常,但对于来自 Linux 的一些 tar/zip 文件,文件名中带有冒号(“:”),仅创建名称在“:”部分之前的空文件。
有没有办法在 Windows 上通过 python 使这些文件与名称中的“:”兼容? (例如成功提取文件后将“:”替换为“_”?)
这是我的测试脚本代码:
import zipfile
import tarfile
uri="/path/to/file.zip"
file = zipfile.ZipFile(uri, 'r')
file.extractall(uri[:-4])
uri="/path/to/file.tar"
file = tarfile.open(uri, 'r')
file.extractall(uri[:-4])
zipfile
自动执行建议的转换。对于 tarfile,您必须向 errors
提供 TarFile
参数,因为正常的 surrogateescape
似乎不适合您。
您可以迭代每个项目,替换文件名中的无效字符,然后将它们提取到所需的位置,而不是使用
extractall()
提取所有文件:
ZIP文件的实现:
import zipfile
import os
def sanitize_filename(filename)
return filename.replace(":", "_")
uri = "/path/file.zip"
output_dir = uri[:-4]
with zipfile.ZipFile(uri, 'r') as zip_file:
for member in zip_file.namelist():
filename = sanitize_filename(member)
source = zip_file.open(member)
target = os.path.join(output_dir, filename)
os.makedirs(os.path.dirname(target), exist_ok=True)
with open(target, "wb") as target_file:
target_file.write(source.read())
TAR文件的实现:
import tarfile
import os
def sanitize_filename(filename):
return filename.replace(":", "_")
uri = "/path/file.zip"
output_dir = uri[:-4]
with tarfile.open(uri, 'r') as tar_file:
for member in tar_file.getmembers():
filename = sanitize_filename(member.name)
source = tar_file.extractfile(member)
target = os.path.join(output_dir, filename)
os.makedirs(os.path.dirname(target), exist_ok=True)
if source is not None:
with open(target, "wb") as target_file:
target_file.write(source.read())