Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >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
运行
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
运行
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
运行
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
运行
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

复制
相关文章
PHP 数组:索引数组与关联数组
在静态语言(C、Java、Go)中,数组的定义通常是同一类型数据的连续序列,PHP 的数组从功能角度来说更加强大,可以包含任何数据类型,支持无限扩容,并且将传统数组和字典类型合二为一,在 PHP 中,传统的数组对应的是索引数组,字典类型对应的是关联数组,这得益于 PHP 底层通过哈希表实现数组功能。下面,我们就来简单介绍下 PHP 索引数组和关联数组的基本使用。
学院君
2020/05/27
6K0
PHP如何删除关联数组中键值
1、使用unset()函数可以用于取消设置关联数组中的键及其值。 $arr = array( "1" => "加", "2" => "减", "3" => "乘", "4" => "除" ); // 关联数组中删除键1及其值 unset($arr['1']); // 显示数组元素 var_dump($arr); 2、使用array_diff_key()函数用于获取一个或多个数组之间的差集。 此函数比较一个或多个数组之间的键并返回它们之间的差集。 / $arr = arr
用户7353560
2021/11/07
1.8K0
【说站】php中PDO获取关联数组
1、可以使用 PDO::FETCH_ASSOC 来获取关联数组,PDO::FETCH_NUM 来获取数字数组,使用 PDO::FETCH_OBJ 来获取对象数组。
很酷的站长
2022/11/24
3K0
【说站】php中PDO获取关联数组
PHP 如何从关联数组移除指定的键值对
如果要移除多个键值对,就要调用多次的 unset 函数,所以把他合并成一个函数 wpjam_array_excerpt:
Denis
2023/04/14
2.3K0
PHP 关联数组的十大使用技巧
关联数组是 PHP 中使用最广泛的一种数据类型,PHP 内置多种操作关联数组的函数,对开发人员来说,要从中找出最有效,最合适自己所开发程序的方法来操纵这些数组。
Denis
2023/04/15
8570
PHP 如何向关联数组指定的 Key 之前插入元素
但是如果要在指定的键之前插入元素呢?下面的代码将 data 插入关联数组 array 的键名为
Denis
2023/04/14
4.6K0
PHP 关联数组操作太麻烦,试试这几个 WPJAM Basic 内置的数组处理函数
PHP 有很多非常好用的数组处理函数,PHP 数组函数官方文档都有 80 多个,但是在使用过程,有一些数组的操作使用比较多,我就把这些函数整理成工具函数,然后整合到 WPJAM Basic 中,方便自己的二次开放时候使用,现在整理放出来,如果你和我一样基于 WPJAM Basic 进行二次开发,也可以使用:
Denis
2023/04/13
5820
ajax前端传多维数组到php后台,关联数组转json到后台方法
这是一个技术性的问题,百度说的JSON.stringify(arr)是不能转换关联数组的,甚至索引数组也是有很多缺点
仙士可
2019/12/19
3.1K0
ajax前端传多维数组到php后台,关联数组转json到后台方法
PHP 如何从关联数组中移除并返回指定的键值对
该功能已经整合到 WPJAM Basic 插件中,并已免费提供下载,简单勾选或者设置下即可开启!
Denis
2023/04/14
5.4K0
PHP array_chunk() 函数
其中每个数组的单元数目由 size 参数决定。最后一个数组的单元数目可能会少几个。
用户1448800
2021/08/17
4350
PHP 的数组
数组就是一组数据的集合,把一系列数据组织起来。如果变量是存储单个值的容器,那么数组就是存储多个值的容器。数组每个实体包含一个键和一个值。
小末快跑
2020/05/08
6.5K0
指针与数组的关联3 --声明
    当我们在调用函数时,传递数组,就是把数组首元素的地址传递给函数,本质也就是给函数传递了一个指针变量。这时候我们会想那么数组是不是跟指针是一样的。为了验证,我们可以给一个项目里创建一个新的源文件,里面创建一个指针变量和是个数组,然后在另一个文件中用数组的方法声明指针,在用指针的方法声明这个数组进行调试,看下结果会如何。
py3study
2020/01/13
8980
判断某个值是否在多维关联数组中 返回该值的所在的关联数组
public function deep_in_array($value, $array) { foreach($array as $item) { if(!is_array($item)) { if ($item == $value) { return $item; } else { continue; } } i
OwenZhang
2021/12/08
5.5K0
c专题指针-----数组与指针的关联
有一个礼拜没写文章了,所以不由的想起这段话来,好好学习,不要浮躁。好了进入今天的主题:
用户6280468
2022/03/18
1.1K0
c专题指针-----数组与指针的关联
PHP 数组
本章主要介绍 PHP 数组的一些应用: <?php // 带数组下标的数组 $paper[] = "Ma"; $paper[] = "Hao"; for ($i = 0; $i < 2; ++$i)
echobingo
2018/04/25
4.8K0
PHP 数组
PHP数组
函数默认是进行升序排序,同时函数也接受第二个参数指定排序方法:SORT_ASC(升序)、SORT_DESC(降序)
Mirror王宇阳
2020/11/10
7.2K0
PHP基础——PHP数组
PHP数组与其他语言的数组有些不同,在PHP中,数组包含两种类型的数组: 数字索引数组 关联数组 其中,数字索引数组是指其key为数字,而后者可以使用字符串作为其key,这相当于map。 1、数组的声
felixzhao
2018/03/14
8.5K0
最全最详细的PHP面试题(带有答案)
这篇文章介绍的内容是关于最全最详细的PHP面试题(带有答案),有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
叫我可儿呀
2019/11/27
1.5K0
最全最详细的PHP面试题(带有答案)
PHP基础——PHP数组
其中,数字索引数组是指其key为数字,而后者可以使用字符串作为其key,这相当于map。
felixzhao
2019/01/31
7.3K0
点击加载更多

相似问题

前置关联数组表

20

数组前置循环PHP

20

PHP数组前置问题

11

PHP数组前置项

25

带有数字键的php排序多个数组

27
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档