compress.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # Copyright (C) 2015, Ansgar Burchardt <ansgar@debian.org>
  2. #
  3. # This program is free software; you can redistribute it and/or modify
  4. # it under the terms of the GNU General Public License as published by
  5. # the Free Software Foundation; either version 2 of the License, or
  6. # (at your option) any later version.
  7. #
  8. # This program is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. # GNU General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU General Public License along
  14. # with this program; if not, write to the Free Software Foundation, Inc.,
  15. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  16. """
  17. Helper methods to deal with (de)compressing files
  18. """
  19. import os
  20. import shutil
  21. import subprocess
  22. def decompress_xz(input, output):
  23. subprocess.check_call(["xz", "--decompress"], stdin=input, stdout=output)
  24. def decompress_bz2(input, output):
  25. subprocess.check_call(["bzip2", "--decompress"], stdin=input, stdout=output)
  26. def decompress_gz(input, output):
  27. subprocess.check_call(["gzip", "--decompress"], stdin=input, stdout=output)
  28. decompressors = {
  29. '.xz': decompress_xz,
  30. '.bz2': decompress_bz2,
  31. '.gz': decompress_gz,
  32. }
  33. def decompress(input, output, filename=None):
  34. if filename is None:
  35. filename = input.name
  36. base, ext = os.path.splitext(filename)
  37. decompressor = decompressors.get(ext, None)
  38. if decompressor is not None:
  39. decompressor(input, output)
  40. else:
  41. shutil.copyfileobj(input, output)