当前位置: 首页 > 面试题库 >

如何从7z压缩的文本文件中读取?

郭远
2023-03-14
问题内容

我想从csv(文本)文件逐行读取(在Python 2.7中),该文件是7z压缩的。我不想解压缩整个(大)文件,而是流线。

我尝试pylzma.decompressobj()失败。我收到数据错误。请注意,此代码尚未逐行读取:

input_filename = r"testing.csv.7z"
with open(input_filename, 'rb') as infile:
    obj = pylzma.decompressobj()
    o = open('decompressed.raw', 'wb')
    obj = pylzma.decompressobj()
    while True:
        tmp = infile.read(1)
        if not tmp: break
        o.write(obj.decompress(tmp))
    o.close()

输出:

    o.write(obj.decompress(tmp))
ValueError: data error during decompression

问题答案:

这将允许您迭代行。它部分源自我在另一个问题的答案中找到的一些代码。

在该时间点(pylzma-0.5.0),该py7zlib模块未实现允许将存档成员作为字节流或字符流读取的API-其ArchiveFile类仅提供了一次read()解压缩并返回成员中未压缩数据的功能。鉴于此,最好的办法是通过Python生成器使用该缓冲区作为缓冲区迭代地返回字节或行。

下面是后者的操作,但是如果问题是存档 成员 文件本身很大,则可能没有帮助。

下面的代码应在Python 3.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))


 类似资料:
  • 问题内容: 我想使用Java代码将文件压缩为zip,rar和7z格式。我也想在指定位置解压缩这些文件。谁能告诉我如何在Java中使用7-zip压缩和解压缩文件? 问题答案: 我用过:sevenzipjbinding.jar sevenzipjbinding-Allplatforms.jar 我现在可以使用这些jar解压缩文件。 尝试使用此链接进行解压缩:http : //sourceforge.n

  • 问题内容: 使用python从gz压缩的文本文件中读取一行很容易,而无需完全提取该文件?我有一个大约200mb的text.gz文件。当我提取它时,它变成7.4gb。这不是我必须阅读的唯一文件。对于整个过程,我必须读取10个文件。尽管这将是一个顺序的工作,但我认为在不影响全部信息的情况下做到这一点将是明智之举。我什至不知道有可能。如何使用python完成?我需要逐行阅读文本文件。 问题答案: 您是否

  • 我正在使用Julia的ZipFile包来提取和处理csv文件。没问题,但是当我遇到zip文件中的zip文件时,我也想处理它,但是遇到了一个错误。 Julia ZipFile文档如下:https://zipfilejl.readthedocs.io/en/latest/ 对如何做到这一点有什么想法吗?

  • 我有一个需要压缩的文件列表,我正在使用ZipoutStream。 当我得到文件时,我将每个文件设置为只读。(我尝试过file.setWritable(false)和file.setReadOnly()) 原始文件被更改,但保存在zip中的文件不仅准备好了。我猜这是因为我必须使用FileInputStream将每个文件添加到zip中。 对于测试,我使用的是我在网上找到的示例代码。 有没有办法使压缩后

  • 问题 你想读写一个gzip或bz2格式的压缩文件。 解决方案 gzip 和 bz2 模块可以很容易的处理这些文件。 两个模块都为 open() 函数提供了另外的实现来解决这个问题。 比如,为了以文本形式读取压缩文件,可以这样做: # gzip compression import gzip with gzip.open('somefile.gz', 'rt') as f: text = f

  • 问题内容: 任何人都可以向我展示在我一直在搜索的Java中压缩和解压缩tar.gzip文件的正确方法,但是我能找到的最多是zip或gzip(单独)。 问题答案: 我最喜欢的是plexus-archiver-请参阅GitHub上的资源。 另一个选项是Apache commons- compress- (请参阅mvnrepository)。 使用plexus-utils,用于取消存档的代码如下所示: