访问日志文件并返回/打开那里写的所有文件

时间:2016-03-13 23:15:17

标签: python python-3.x logging

For Reference

我有一个python类,它应该解压缩一个存档并递归遍历目录结构然后返回文件以便进一步处理。在我的情况下,我想散列这些文件。我正在努力回归文件。这是我的看法。 我创建了一个解压缩函数,这个函数创建一个日志文件,其中包含已解压缩的文件的所有路径。然后我想访问这个日志文件并返回所有文件,这样我就可以在另一个python类中使用它们进行进一步处理。这似乎还不行。

日志文件的结构:

/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 

2 个答案:

答案 0 :(得分:0)

我相信你正在寻找的东西:

@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

您在迭代时返回,无法打开其他文件。

答案 1 :(得分:0)

由于您主要处理存储在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))