如何在windows上使用python提取名称中带有冒号的文件

问题描述 投票:0回答:2

我正在编写一个脚本,用于在 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])
python windows extract
2个回答
0
投票

zipfile
自动执行建议的转换。对于 tarfile,您必须向
errors
提供
TarFile
参数,因为正常的
surrogateescape
似乎不适合您。


0
投票

您可以迭代每个项目,替换文件名中的无效字符,然后将它们提取到所需的位置,而不是使用

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())
© www.soinside.com 2019 - 2024. All rights reserved.