用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文件?的主要内容,如果未能解决你的问题,请参考以下文章