我有一个python类,它解压一个归档文件,递归地迭代目录结构,然后返回文件进行进一步处理。在我的例子中,我想散列这些文件。我很难把文件还回去。这是我的观点。我创建了一个解压缩函数,该函数用解压后的文件的所有路径创建日志文件。然后我想访问这个日志文件,并返回所有的文件,这样我就可以在另一个python类中使用它们,因为processing.This似乎还不能工作。
日志文件的结构:
/home/usr/Downloads/outdir/XXX.log
/home/usr/Downloads/outdir/Code/XXX.py
/home/usr/Downloads/outdir/Code/XXX.py
/home/usr/Downloads/outdir/Code/XXX.py感兴趣的代码:
@staticmethod
def read_received_files(from_log):
    with open(from_log, 'r') as data:
        data = data.readlines()
        for lines in data: 
            \\ This does not seem to work zet
            read_files = open(lines.strip())
            return read_files 发布于 2016-03-14 07:23:19
我相信这就是你要找的:
@staticmethod
def read_received_files(from_log):
    files = []
    with open(from_log, 'r') as data:
        for line in data:
            files.append(open(line.strip()))
    return files您在迭代时返回,阻止打开其他文件。
发布于 2016-03-14 09:56:08
由于您主要关注的是存储在zip文件中的文件的元数据和散列,而不是文件本身,因此不需要将文件解压缩到文件系统。
相反,您可以使用ZipFile.open()方法通过一个类似文件的对象来访问文件的内容。可以使用每个文件的ZipInfo对象收集元数据。这是一个获取文件名和文件大小作为元数据的示例,以及文件的散列。
import hashlib
import zipfile
from collections import namedtuple
def get_files(archive):
    FileInfo = namedtuple('FileInfo', ('filename', 'size', 'hash'))
    with zipfile.ZipFile(archive) as zf:
        for info in zf.infolist():
            if not info.filename.endswith('/'):  # exclude directories
                f = zf.open(info)
                hash_ = hashlib.md5(f.read()).hexdigest()
                yield FileInfo(info.filename, info.file_size, hash_)
for f in get_files('some_file.zip'):
    print('{}: {} {} bytes'.format(f.hash, f.filename, f.size))https://stackoverflow.com/questions/35977094
复制相似问题