用python os walk解压30000个子文件夹中的bz2文件?

Posted

技术标签:

【中文标题】用python os walk解压30000个子文件夹中的bz2文件?【英文标题】:Decompress bz2 files in 30,000 subfolders with python os walk? 【发布时间】:2017-12-07 22:57:24 【问题描述】:

我有 30,000 个文件夹,每个文件夹包含 5 个 bz2 的 json 数据文件。

我正在尝试使用 os.walk() 循环遍历文件路径并将每个压缩文件解压并保存在原始目录中。

import os
import bz2

path = "/Users/mac/PycharmProjects/OSwalk/Data"
for(dirpath,dirnames,files) in os.walk(path):

for filename in files:
    filepath = os.path.join(dirpath , filename)
     newfilepath = os.path.join(dirpath , filename + '.decompressed')

        with open(newfilepath , 'wb') as new_file , 
          bz2.BZ2File(filepath , 'rb') as file:

              for data in iter(lambda: file.read(100 * 1024) , b''):
                  new_file.write(data)

运行代码时出现以下错误。

File 
"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_compr 
ession.py", line 103, in read
data = self._decompressor.decompress(rawblock, size)
OSError: Invalid data stream

我了解到使用解压器方法在 mac 上运行代码可能会出现问题,还是我遗漏了其他内容?

【问题讨论】:

【参考方案1】:

看起来您可能正在尝试解压缩已解压缩的结果。你应该过滤掉它们。

import os
import bz2

path = "/Users/mac/PycharmProjects/OSwalk/Data"
for (dirpath, dirnames, files) in os.walk(path):
    for filename in files:
        # filter out decompressed files
        if filename.endswith('.decompressed'):
            continue

        filepath = os.path.join(dirpath, filename)
        newfilepath = os.path.join(dirpath, filename + '.decompressed')

        with open(newfilepath, 'wb') as new_file,
            bz2.BZ2File(filepath, 'rb') as file:

            for data in iter(lambda: file.read(100 * 1024), b''):
                new_file.write(data)

【讨论】:

我在你的 if 语句中添加了,但代码仍然没有运行。我想知道是 bz2 导入模块吗? 这取决于。你如何压缩这些文件? 我从网上下载了 .tar 格式的文件。我将 tar 转换为普通文件夹目录。压缩是从我假设的服务器完成的 我不认为 bunzip2 在 mac 上工作。看起来像一个linux软件包。我尝试安装 pip 并收到一条不满意的消息。找不到满足 bunzip2 要求的版本(来自版本:)找不到 bunzip2 的匹配发行版

以上是关于用python os walk解压30000个子文件夹中的bz2文件?的主要内容,如果未能解决你的问题,请参考以下文章

python遍历文件夹中所有文件夹和文件,os.walk

python中的os.walk

Python 之 os.walk()

python os.walk()代码详解

python怎样压缩和解压缩ZIP文件

python os.walk()