通过SSH服务器,我可以访问数据集。此数据集分为几个文件,每个文件名为File1.xml.gz
,File2.xml.gz
等。...这些文件的命名在两种方面有点误导:
由于它是文件夹,所以我假设它严格来说是.tar.gz
文件,但是从名称上并不明显(它只显示.gz
)。
解压缩它们时,不会直接得到File1.xml
等,但是它们都包含第一个(子)文件夹(没有其他内容),而后者又包含第二个子文件夹( (别无其他),这是第三个子文件夹(别无其他),最后一个包含第四个子文件夹,其中File1.xml
(无别的地方)位于
我已经在文件夹结构的图片中对此进行了草绘:
正是我要访问的最低级别的文件。
我的问题: 我不允许删除(显然是多余的)文件夹,并且服务器上几乎没有剩余空间,并且文件非常大,所以我不能只是打开它们的包装。因此,我想逐行读取文件的内容。
我想我知道如何找到嵌入在多个子文件夹中的文件:
for root, dirs, files in os.walk(directory, topdown=False):
for file in files:
if file.startswith('file') and file.endswith('.xml'):
# do something with file
而且我知道如何在不显式解压缩的情况下读取压缩文件:
with gzip.open('path to file1.xml.gz', 'rt', encoding='utf-8') as file1:
for line in file1:
print(line)
但是要访问压缩文件夹的子子文件夹中的文件吗?有可能吗?
答案 0 :(得分:4)
使用tarfile,以模式"r|gz"
打开。使用next()
直到找到所需的内容,然后对该成员使用extractfile()
返回可以读取的缓冲流。
>>> import tarfile
>>> t = tarfile.open("file.gz","r|gz")
>>> t.next()
<TarInfo 'a' at 0x1044d3b38>
>>> t.next()
<TarInfo 'a/b' at 0x1044d39a8>
>>> t.next()
<TarInfo 'a/b/c' at 0x1044d38e0>
>>> t.next()
<TarInfo 'a/b/c/d' at 0x1044d3a70>
>>> m = t.next()
>>> m.name
'a/b/c/d/file'
>>> f = t.extractfile(m)
>>> f.readline()
b'this\n'
>>> f.readline()
b'is\n'
>>> f.readline()
b'a\n'
>>> f.readline()
b'test\n'
>>> f.readline()
b''