python解压7z文件_如何读取用7z压缩的文本文件?
這將允許您迭代行。它的一部分是從我在answer中找到的一些代碼派生出來的。
在這個時間點(pylzma-0.5.0)上,py7zlib模塊沒有實現允許存檔成員作為字節流或字符流讀取的API,它的ArchiveFile類只提供一個read()函數,該函數一次解壓縮并返回成員中的未壓縮數據。考慮到這一點,最好的方法是通過Python生成器將字節或行作為緩沖區迭代返回。
下面是后者,但如果問題是存檔成員文件本身太大,則可能沒有幫助。
下面的代碼應該可以在Python3.x和2.7中使用。import io
import os
import py7zlib
class SevenZFileError(py7zlib.ArchiveError):
pass
class SevenZFile(object):
@classmethod
def is_7zfile(cls, filepath):
""" Determine if filepath points to a valid 7z archive. """
is7z = False
fp = None
try:
fp = open(filepath, 'rb')
archive = py7zlib.Archive7z(fp)
_ = len(archive.getnames())
is7z = True
finally:
if fp: fp.close()
return is7z
def __init__(self, filepath):
fp = open(filepath, 'rb')
self.filepath = filepath
self.archive = py7zlib.Archive7z(fp)
def __contains__(self, name):
return name in self.archive.getnames()
def readlines(self, name, newline=''):
r""" Iterator of lines from named archive member.
`newline` controls how line endings are handled.
It can be None, '', '\n', '\r', and '\r\n' and works the same way as it does
in StringIO. Note however that the default value is different and is to enable
universal newlines mode, but line endings are returned untranslated.
"""
archivefile = self.archive.getmember(name)
if not archivefile:
raise SevenZFileError('archive member %r not found in %r' %
(name, self.filepath))
# Decompress entire member and return its contents iteratively.
data = archivefile.read().decode()
for line in io.StringIO(data, newline=newline):
yield line
if __name__ == '__main__':
import csv
if SevenZFile.is_7zfile('testing.csv.7z'):
sevenZfile = SevenZFile('testing.csv.7z')
if 'testing.csv' not in sevenZfile:
print('testing.csv is not a member of testing.csv.7z')
else:
reader = csv.reader(sevenZfile.readlines('testing.csv'))
for row in reader:
print(', '.join(row))
總結
以上是生活随笔為你收集整理的python解压7z文件_如何读取用7z压缩的文本文件?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云技术将开启Netflix般的云游戏时代
- 下一篇: WPF界面美化(整体作用到控件),一步步