【问题标题】:gzip -t in a loop and run scriptgzip -t 循环运行脚本
【发布时间】:2020-09-20 11:34:09
【问题描述】:

我在一个文件夹中有几个 *.gz 文件,我想在它们上运行一个 python 脚本。但是,我一直在出错。这些错误与损坏的 gz 文件有关。

我想在正确压缩的 gz 文件中运行我的 python 脚本ONLY。我尝试了以下方法:

for i in *.gz;
do
    if gzip -t $i
    then
        python myscript.py
    else
        echo 'file is corrupt'
    fi
done;

但是我的脚本也在损坏的 gz 文件中运行(并且出现很多错误)。

或者,我可以修改 python 脚本以仅读取未损坏的 gz 文件吗?

我当前脚本的顶部是:

for tf in glob.glob('*.gz'):
    tar = tarfile.open(tf)
    tar.extractall()
    tar.close()
    files = [file for file in glob.glob('*.txt')] ..

如果我打开 gz 文件,我想保留它(因为我知道 gunzip 会在解压缩时删除原始 gz 文件)。

提前致谢

【问题讨论】:

  • gunzip -k,保持输入文件完整,不会删除它们
  • @gusa10 : 你有没有尝试手动gunzip 一个你的 Python 程序声称已损坏的存档?我的猜测是这些档案并没有真正损坏,但问题出在 Python 代码中。特别是,我认为您需要gzip.open,而不是tarfile.open
  • 是的,我无法再提取这些 *.gz 文件中的文件了。此外,它们的大小比预期的要小。这对我来说很奇怪,因为我之前处理过这些文件并且一切都很好。

标签: python bash for-loop gzip


【解决方案1】:

用途:

gunzip -t $i

改为检查是否有损坏:

for i in *.gz;
do
    if gunzip -t $i
    then
        python myscript.py
    else
        echo 'file is corrupt'
    fi
done;

gunzip 的默认值是解压缩。

-t 测试文件的完整性。

使用 bash 完成这一切:

for i in *.gz;
do
    if gunzip -t $i
    then
        gzip -d $1 # -d decompress
    else
        echo 'file is corrupt'
    fi
done;

当您将 -k 选项传递给 gunzip 时,gunzip 会保留原始文件,-k 用于保留输入文件

【讨论】:

  • 谢谢@bhristov。但是,似乎仍在为损坏的文件运行该脚本。输出错误仍然是: Traceback (most recent call last): File "myscript.py", line 8, in tar.extractall() ......... EOFError: Compressed file end before the end已达到流标记。
  • @gusa10 你应该使用 gunzip 或 gzip 而不是 tar 来解压。
  • 谢谢。你能帮我解决这个问题吗?我已经修改了问题。
  • @gusa10 我们可以使用 bash 来做到这一点吗?我认为这会容易得多。
  • 是的。估计gz解压后启动python脚本是个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2018-10-09
  • 2017-08-25
  • 2017-03-26
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多