- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我目前正在开发一个必须提取一些 .tar 文件的工具。
它在大多数情况下都工作得很好,但我有一个问题:
某些 .tar 和 .zip 文件的名称包含“非法”字符(f.ex“:”)。这个程序必须在 Windows 机器上运行,所以我必须处理这个问题。
如果提取的输出中包含“:”或其他非法 Windows 字符,我是否可以更改某些文件的名称。
我当前的实现:
def read_zip(filepath, extractpath):
with zipfile.ZipFile(filepath, 'r') as zfile:
contains_bad_char = False
for finfo in zfile.infolist():
if ":" in finfo.filename:
contains_bad_char = True
if not contains_bad_char:
zfile.extractall(path=extractpath)
def read_tar(filepath, extractpath):
with tarfile.open(filepath, "r:gz") as tar:
contains_bad_char = False
for member in tar.getmembers():
if ":" in member.name:
contains_bad_char = True
if not contains_bad_char:
tar.extractall(path=extractpath)
所以目前我只是忽略这些输出,这并不理想。
为了更好地描述我的要求,我可以提供一个小例子:
file_with_files.tar -> small_file_1.txt
-> small_file_2.txt
-> annoying:file_1.txt
-> annoying:file_1.txt
应该提取到
file_with_files -> small_file_1.txt
-> small_file_2.txt
-> annoying_file_1.txt
-> annoying_file_1.txt
迭代压缩文件中的每个文件对象并一一提取是唯一的解决方案还是有更优雅的解决方案?
最佳答案
根据[Python.Docs]: ZipFile.extract(member, path=None, pwd=None) :
On Windows illegal characters (
:
,<
,>
,|
,"
,?
, and*
) replaced by underscore (_
).
所以,事情已经解决了:
>>> import os
>>> import zipfile
>>>
>>> os.getcwd()
'e:\\Work\\Dev\\StackOverflow\\q055340013'
>>> os.listdir()
['arch.zip']
>>>
>>> zf = zipfile.ZipFile("arch.zip")
>>> zf.namelist()
['file0.txt', 'file:1.txt']
>>> zf.extractall()
>>> zf.close()
>>>
>>> os.listdir()
['arch.zip', 'file0.txt', 'file_1.txt']
快速浏览TarFile(源代码和doc)并没有发现任何类似的东西(如果没有的话我也不会感到非常惊讶,因为< em>.tar 格式主要用于 Nix),因此您必须手动执行此操作。事情并不像我想象的那么简单,因为 TarFile 不提供以不同名称提取成员的可能性,就像 ZipFile 那样。
无论如何,这是一段代码(我有ZipFile和TarFile作为缪斯或灵感来源):
code00.py:
#!/usr/bin/env python
import sys
import os
import tarfile
def unpack_tar(filepath, extractpath=".", compression_flag="*"):
win_illegal = ':<>|"?*'
table = str.maketrans(win_illegal, '_' * len(win_illegal))
with tarfile.open(filepath, "r:" + compression_flag) as tar:
for member in tar.getmembers():
#print(member, member.isdir(), member.name, member.path)
#print(type(member))
if member.isdir():
os.makedirs(member.path.translate(table), exist_ok=True)
else:
with open(os.path.join(extractpath, member.path.translate(table)), "wb") as fout:
fout.write(tarfile.ExFileObject(tar, member).read())
def main(*argv):
unpack_tar("arch00.tar")
if __name__ == "__main__":
print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
64 if sys.maxsize > 0x100000000 else 32, sys.platform))
rc = main(*sys.argv[1:])
print("\nDone.")
sys.exit(rc)
请注意,上述代码适用于简单的 .tar 文件(具有简单的成员,包括目录)。
已提交[Python.Bugs]: tarfile: handling Windows (path) illegal characters in archive member names 。
我不知道它的结果会是什么,因为我提交了几个更严重的问题(以及对它们的修复)(根据我的PoV),但是对于种种原因,都被拒绝了。
关于python - Tarfile/Zipfile extractall() 更改某些文件的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55340013/
我制作了一个如下所示的小脚本来读取文件组并将它们压缩,一切正常,接受压缩文件在解压缩时包含文件的完整路径。有没有没有目录结构的方法? compressor = tarfile.open(PATH_TO
我正在尝试使用 tarfile 在内存中添加一个文件,然后将其写回磁盘,但我遇到的问题是在我的最终输出中,当我提取新创建的 tar.gz 文件时,我得到一个空文件。我的代码哪里做错了? import
我想从压缩包中读取一些文件并将其保存到新的压缩包中。这是我写的代码。 archive = 'dum/2164/archive.tar' # Read input data. input_tar = t
我可以用这种方式计算 tarfile 中文件的大小: import tarfile tf = tarfile.open(name='my.tgz', mode='r') reduce(lambda x
我有 .tar.bz2 文件,里面有很多小的 json 文件。一个存档可能有大约数千个,而且 json 很小(低于 10kB,通常也低于 1 KB)。因此,压缩后的单个存档不会超过 100kB。 根据
我有以下文件: # ls -lha total 2.4M drwxr-xr-x. 2 root root 4.0K Nov 26 19:47 . drwxrwxr-x. 5 bshus
我想创建一个 tar 文件并将其通过管道传输到 http 上传。 但是,似乎 python tarfile 模块执行搜索,这使得无法通过管道传输到下一个进程。 这是代码 tar = tarfile.o
在将文件添加到 python 中的 tar 存档时,是否有任何库可以显示进度,或者可以扩展 tarfile 模块的功能来执行此操作? 在理想情况下,我想展示 tar 创建的总体进度以及关于何时完成的预
如何在 python 中将空目录添加到 tarfile,而不先在磁盘上创建它? 在我的本地文件系统中创建一个空目录,并将其添加到 tar 文件中很容易,但会产生不必要的开销。 直接在 tar 文件中创
这是 Python 文档的摘录: If exclude is given it must be a function that takes one filename argument and retu
Create a zip file from a generator in Python?描述了将一堆文件写入 .zip 到磁盘的解决方案。 我在相反的方向也有类似的问题。我得到了一个发电机: str
我正在使用以下代码提取一个 tar 文件: import tarfile tar = tarfile.open("sample.tar.gz") tar.extractall() tar.close(
我尝试使用 with 语句和 tarfile 模块... with tarfile.open('/dir/dir/dir.tar.gz', 'w:gz') as fl: fl.add('/di
我有一个包含 bz2 压缩文件的 tarfile。我想将函数 clean_file 应用于每个 bz2 文件,并整理结果。在系列中,这很容易用一个循环: import pandas as pd imp
我正在尝试将文件添加到 python 中的 gzipped tarfile import tarfile # create test file with open("testfile.txt", "w
使用 tarfile.add 添加目录时,是否可以访问 filter lambda 中的各个文件名? 我正在使用 tarfile 模块来创建项目目录的存档。其中一些文件我不再需要,我想忽略: mypr
我正在尝试将 tar.gz 文件中的所有内容提取到同一目录中。以下代码可以提取所有文件,但文件存储在工作目录中,而不是我输入的名称路径中。 import tarfile zip_rw_data = r
是否有办法防止 tarfile.extractall ( API ) 覆盖现有文件?我所说的“防止”是指理想情况下在即将发生覆盖时引发异常。当前的行为是静默覆盖文件。 最佳答案 您可以查看 tar
我正在尝试使用 tarfile 库归档和压缩分布在多个驱动器上的多个目录。问题是即使两个文件存储在不同的驱动器中,tarfile 也会合并路径。例如: import tarfile with tarf
我的问题是对这个 one 的跟进.我想知道如何修改以下代码以便分配压缩级别: import os import tarfile home = '//global//scratch//chamar//p
我是一名优秀的程序员,十分优秀!