首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python -识别压缩文件类型和解压缩的机制

Python -识别压缩文件类型和解压缩的机制
EN

Stack Overflow用户
提问于 2012-10-24 07:24:36
回答 7查看 20.9K关注 0票数 27

压缩文件可分为以下逻辑组

a.你正在使用的操作系统(*ix,Win)等等。

b.不同类型的压缩算法(即.zip、.Z、.bz2、.rar、.gzip)。至少从最常用的压缩文件的标准列表。

c.然后我们有了焦油球机制--我想没有压缩。但它的行为更像是一种串联。

现在,如果我们开始处理上述一组压缩文件,

a.选项(a)将由python处理,因为它是独立于平台的语言。

b.方案(b)和(c)似乎有问题。

我需要什么

如何识别文件类型(压缩类型),然后解压缩?

像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fileType = getFileType(fileName)  
switch(fileType):  
case .rar:  unrar....
case .zip:  unzip....

etc  

所以最基本的问题是我们如何识别基于文件的压缩算法(假设没有提供扩展名或扩展名不正确)?在python中有什么特别的方法吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-10-24 07:53:39

This page有一个“神奇”文件签名列表。把你需要的东西放在字典里,如下所示。然后我们需要一个函数来匹配dict键和文件的开头。我已经写了一个建议,尽管它可以通过将magic_dict预处理成一个巨大的编译正则表达式来进行优化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
magic_dict = {
    "\x1f\x8b\x08": "gz",
    "\x42\x5a\x68": "bz2",
    "\x50\x4b\x03\x04": "zip"
    }

max_len = max(len(x) for x in magic_dict)

def file_type(filename):
    with open(filename) as f:
        file_start = f.read(max_len)
    for magic, filetype in magic_dict.items():
        if file_start.startswith(magic):
            return filetype
    return "no match"

这个解决方案应该是跨平台的,当然不依赖于文件扩展名,但它可能会给带有随机内容的文件带来误报,这些随机内容恰好是以一些特定的魔术字节开始的。

票数 37
EN

Stack Overflow用户

发布于 2012-10-24 08:57:43

基于lazyr的回答和我的评论,我的意思是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CompressedFile (object):
    magic = None
    file_type = None
    mime_type = None
    proper_extension = None

    def __init__(self, f):
        # f is an open file or file like object
        self.f = f
        self.accessor = self.open()

    @classmethod
    def is_magic(self, data):
        return data.startswith(self.magic)

    def open(self):
        return None

import zipfile

class ZIPFile (CompressedFile):
    magic = '\x50\x4b\x03\x04'
    file_type = 'zip'
    mime_type = 'compressed/zip'

    def open(self):
        return zipfile.ZipFile(self.f)

import bz2

class BZ2File (CompressedFile):
    magic = '\x42\x5a\x68'
    file_type = 'bz2'
    mime_type = 'compressed/bz2'

    def open(self):
        return bz2.BZ2File(self.f)

import gzip

class GZFile (CompressedFile):
    magic = '\x1f\x8b\x08'
    file_type = 'gz'
    mime_type = 'compressed/gz'

    def open(self):
        return gzip.GzipFile(self.f)


# factory function to create a suitable instance for accessing files
def get_compressed_file(filename):
    with file(filename, 'rb') as f:
        start_of_file = f.read(1024)
        f.seek(0)
        for cls in (ZIPFile, BZ2File, GZFile):
            if cls.is_magic(start_of_file):
                return cls(f)

        return None

filename='test.zip'
cf = get_compressed_file(filename)
if cf is not None:
    print filename, 'is a', cf.mime_type, 'file'
    print cf.accessor

现在可以使用cf.accessor访问压缩数据。所有的模块都提供了类似的方法,比如'read()','write()‘等等。

票数 17
EN

Stack Overflow用户

发布于 2012-10-24 07:32:37

这是一个复杂的问题,取决于许多因素:最重要的是您的解决方案需要多大的可移植性。

在给定文件的情况下,查找文件类型的基本方法是在文件中查找标识标头,通常称为"magic sequence" or signature header,它标识文件属于某种类型。如果可以避免,通常不会使用它的名称或扩展名。对于某些文件,Python内置了此功能。例如,要处理.tar文件,可以使用tarfile模块,它有一个方便的is_tarfile方法。还有一个类似的模块,名为zipfile。这些模块还允许您使用纯Python提取文件。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f = file('myfile','r')
if zipfile.is_zipfile(f):
    zip = zipfile.ZipFile(f)
    zip.extractall('/dest/dir')
elif tarfile.is_tarfile(f):
    ...

如果您的解决方案仅适用于Linux或OSX,也可以使用file命令,它将为您完成大量工作。您还可以使用内置工具来解压缩文件。如果你只是在做一个简单的脚本,这个方法会更简单,会给你带来更好的性能。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13044562

复制
相关文章
Scala中的方法与函数
封装是计算机编程语言中最基本但也十分经典的思想(更严谨地说封装是面向对象设计中的一种思想),例如将一段频繁用到的逻辑写成一个函数的过程,其背后蕴含的其实就是封装的思想。与众多编程语言类似,Scala中也提供了方法和函数的功能,但在具体使用上又有很多特别之处,甚至一定程度上可以彰显Scala的设计理念。
luanhz
2021/03/04
1K0
Scala中的方法与函数
JavaScript 函数中带有参数并返回值的函数
document.getElementById("demo").innerHTML=myFunction(4,3);
好派笔记
2021/09/18
5.7K0
git命令中带有特殊符号如@
使用带用户密码clone的方式: git clone https://username:password@remote 当username和password中含有特殊符号会导致出错, 因为为http的请求,所以需要将特殊符号encode成url格式的 java使用: String c = java.net.URLEncoder.encode(".","utf-8"); System.out.println(c); 源文档 <http://blog.csdn.net/qq1142003960/article/
千往
2018/01/24
2.1K0
【Scala篇】--Scala中的函数
Scala中的函数还是比较重要的,所以本文章把Scala中可能用到的函数列举如下,并做详细说明。
LhWorld哥陪你聊算法
2018/09/13
1.5K0
【Scala篇】--Scala中的函数
js中带有参数的函数作为值传入后调用问题
每天不是在写 bug,就是在解 bug 的路上~更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
小闫同学啊
2020/07/14
8.6K0
Redis–SpringCache(二)带有参数的方法缓存
在@Cacheable的key属性中通过#参数名可以获取到方法参数。key中内容Spring EL,既然是表达式字符串要用单引号,没有被单引号包含的内容都表示变量。
全栈程序员站长
2021/04/07
1.4K0
Scala 【 3 循环、函数和参数 】
块表达式,指的是 {} 中的值,其中可以包含多条语句, 最后一个语句的值就是快表达式的值。
Lokinli
2023/03/09
5830
Scala中的偏函数
艺术地说,Scala中的Partial Function就是一个“残缺”的函数,就像一个严重偏科的学生,只对某些科目感兴趣,而对没有兴趣的内容弃若蔽履。Partial Function做不到以“偏”概全,因而需要将多个偏函数组合,最终才能达到全面覆盖的目的。所以这个Partial Function确实是一个“部分”的函数。 对比Function和Partial Function,更学术味的解释如下: 对给定的输入参数类型,函数可接受该类型的任何值。换句话说,一个(Int) => String 的函数可以接收
张逸
2018/03/07
2.6K0
Scala的方法和函数讲解
在Scala中,它和Java一样也是拥有方法和函数。Scala的方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说,在类中定义的函数即是方法。
用户8870853
2021/08/30
5060
Scala的方法和函数讲解
在Scala中,它和Java一样也是拥有方法和函数。Scala的方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说,在类中定义的函数即是方法。
用户8670130
2021/08/31
8920
Scala 方法与函数(八)
Scala 有方法与函数,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
王知无-import_bigdata
2019/03/15
5170
Scala基础 - 函数和方法的区别
1. 函数和方法 在Scala中函数是一等公民,你可以像操作数字一样将函数赋值给一个变量。使用val语句可以定义函数,def语句定义方法: class Test{ def m(x: Int) = x + 3 val f = (x: Int) => x + 3 } 在Scala中无法直接操作方法,如果要操作方法,必须先将其转换成函数。有两种方法可以将方法转换成函数: val f1 = m _ 在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。 也可以显示地告诉编译
joymufeng
2018/05/17
1.3K0
Scala教程之:scala的参数
在Scala中,可以给参数提供默认值,这样在调用的时候可以忽略这些具有默认值的参数。
程序那些事
2020/07/07
6190
如何在 Linux 中创建带有特殊字符的文件?
在 Linux 系统中,创建文件是进行各种操作的基础。有时候,我们需要创建带有特殊字符的文件,例如包含空格、特殊符号或非ASCII字符的文件。本文将详细介绍在 Linux 中如何创建带有特殊字符的文件,以便您能够轻松地完成这样的任务。
网络技术联盟站
2023/08/03
8470
如何在 Linux 中创建带有特殊字符的文件?
如何在 Linux 中创建带有特殊字符的文件?
在 Linux 系统中,创建文件是进行各种操作的基础。有时候,我们需要创建带有特殊字符的文件,例如包含空格、特殊符号或非ASCII字符的文件。本文将详细介绍在 Linux 中如何创建带有特殊字符的文件,以便您能够轻松地完成这样的任务。
网络技术联盟站
2023/07/14
7720
如何在 Linux 中创建带有特殊字符的文件?
Spring @PostMapping 能在 URL 中带有参数吗
Spring 的 @PostMapping 在使用 POST 提交的时候,能不能在 URL 中带参数?
HoneyMoose
2022/09/11
5830
Spring @PostMapping 能在 URL 中带有参数吗
Scala的函数
----------目录--------------------------------------------------------- 1.Scala简介和安装 2.Scala语法介绍 3.Scala的函数 4.Scala中的集合类型 ------------------------------------------------------------------------------------------------------------- Scala的函数 1、函数的声明     scala
云飞扬
2018/05/11
1.4K0
Scala的函数
前文已经提到Scala变量的用法,现在聊聊函数。在Scala里,函数的定义很简单。例如:
哒呵呵
2018/12/18
4320
TypeScript 函数中的 this 参数
从 TypeScript 2.0 开始,在函数和方法中我们可以声明 this 的类型,实际使用起来也很简单,比如:
阿宝哥
2020/03/20
7.8K0
绑定事件中 如可控制函数的执行次数
var flag = true; function onlyOne() { if(flag) { "这里是要执行的代码"; } flag = false//该方法是控制函数仅执行一次 因为flag是全局变量 onlyOne()函数执行一次后flag就变成false了 函数就执行不了了
大当家
2018/06/28
2.3K0

相似问题

用Mockito模拟带函数参数的scala方法

20

如何在scala特征中模拟构造函数参数?

12

如何在scala中模拟参数为新实例的方法

111

Scala (简单)模拟默认方法参数

10

带有递归函数参数的Scala函数

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文