python内容识别

首先,这次又是一个公司的一个任务。任务的要求是将截图中的数据给提取出来,这里面的数据都是不一样的。测试文件为100万份。(本文就只用一份测试数据,因为数据原因这一份测试数据也是假的,不过格式什么的都是一样的。)程序非常的简单。


需求: 一、将红色区域的数据内容定位后,识别出来。 二、输出成能看懂的数据或文件或者图片等。

三、程序不允许断掉,不可以影响程序继续运行。

难题和问题分析: 一、我们需要怎么来处理(废话~。~) 二、那堆乱码应该怎么去定位?(哪里是开始,哪里是结束)

三、一般万条数据肯定有一些我们处理不了。该怎样合理解决?

解决问题: 一、寻找一些特征

(1)我们可以看到数据中有--my类似这样的特殊符号的标识。这下面跟着的就是有效的数据。所以我们先记录下来,用来切片。--my-my-my-boundary-my-my-my (2)然后我在有效数据块的结尾都会看到一串类似这样的标识符。

(3)编写正则:

name="RequestBody"[\s\S]*Content-Disposition: [^\s]* name=[^\s]* filename="([^"]*)"\s*Content-Type: [^\s]*\s*([\S\s]*?)\s*----

我们打开 RegexBuddy(没有的自行百度下载哟),将数据放在下面,正则放在上面。成功匹配。我们开始写程序。


程序实现:

# -*- coding: utf-8 -*-
"""

__author__ = 'se7en'

__date__ = '17/3/24 上午11:32'
"""
from re import compile

bodyCode = '--my-my-my-boundary-my-my-my'
imageEncod = compile(
    r'name="RequestBody"[\s\S]*Content-Disposition: [^\s]* name=[^\s]* filename="([^"]*)"\s*Content-Type: [^\s]*\s*([\S\s]*?)\s*----')

    
def content():
    with open('test.xmpf','r') as f:
        contents =  f.read()

        bounds = contents.split(bodyCode)
        bounds = bounds[1:-1]
        for bound in bounds:
            imageEncod_match = imageEncod.search(bound)

            if imageEncod_match:
                img_name = imageEncod_match.group(1)  # 匹配文件名称
                nameF = img_name[-3:]  # 匹配后缀名
                con = imageEncod_match.group(2)  # 匹配文件内容
                fileFormart = {
                    'jpg': "jpg",
                    'gif': "gif",
                    'png': "png",
                }
                print con #打印匹配的内容
                choose = fileFormart.get(nameF, "No data!")
                make_file(con) # 将图片另存为

def make_file(choose):
    with open('test.jpg','w') as f:
        f.write(choose)

content()

好了,我们运行下看下结果。

到了这里,数据已经提取出来了。但是这样的程序第一不美观,第二后期肯定有很多的重复功能,而且,我们的任务需求还需要程序在运行的时候不能异常中断。所以我们还需要对程序进行加工。


程序加工:

 # -*- coding: utf-8 -*-
"""

__author__ = 'se7en'

__date__ = '17/3/24 上午11:32'
"""
from re import compile
import os
bodyCode = '--my-my-my-boundary-my-my-my'
imageEncod = compile(
    r'name="RequestBody"[\s\S]*Content-Disposition: [^\s]* name=[^\s]* filename="([^"]*)"\s*Content-Type: [^\s]*\s*([\S\s]*?)\s*----')

def get_file():
    with open('test.xmpf','r') as f:
        try:
            con = f.read()
            return content(con)
        except:
            return None


def content(con):
        con = con.split(bodyCode)
        con = con[1:-1]
        for bound in con:
            imageEncod_match = imageEncod.search(bound)

            if imageEncod_match:
                img_name = imageEncod_match.group(1)  # 匹配文件名称
                nameF = img_name[-3:]  # 匹配后缀名
                con = imageEncod_match.group(2)  # 匹配文件内容
                fileFormart = {
                    'jpg': "jpg",
                    'txt': "txt",
                    'gif': "gif",
                    'doc': "doc",
                    'xls': "xls",
                    'pdf': "pdf",
                    'png': "png",
                }
                print con
                choose = fileFormart.get(nameF, "No data!")
                make_file(con,img_name)
                query(img_name,Type=nameF)

def query(*args,**kwargs):
    for ar in args:
        print u"提取 {name}完成".format(name=ar)
    for key,value in kwargs.items():
        print u"图片类型是:{namef}".format(namef=value)

def make_file(choose,name):
    with open(name, 'w') as f:
        f.write(choose)


if __name__ == '__main__':
    
    get_file()

到了这一步我们还需要考虑哪些问题? 一、这只是针对一份文件的提取,那么100万份呢。 二、所有数据的编码格式是否都是utf8或者常见的编码呢。 三、自然语言处理在提取一些数据到时候为什么会用到类似chardet的类库呢(难道编码也是个头疼的问题吗,百度不是很容易就解决了吗?内心独白:很头疼)。

Tags: None

Archives QR Code

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏睿哥杂货铺

Linux 性能诊断:快速检查单(Netflix版)

快速检查单(Quick Reference Handbook,QRH)是飞行员在飞行过程中依赖的重要指导性文件。

4177
来自专栏晓晨的专栏

ASP.NET Core的身份认证框架IdentityServer4(1)-特性一览

1123
来自专栏我是攻城师

分布式日志收集之Logstash 笔记(二)

3346
来自专栏嵌入式程序猿

你的代码敢上Polyspace跑吗?

嵌入式代码动态验证 在嵌入式开发中,代码静态分析工具相信大家应该都熟悉,都用过像PClint,understand C等,但对于动态验证,运行时错误验证工具还是...

6896
来自专栏安智客

《密码模块安全技术要求》解读

今天要讲到的是密码模块安全认证! 中国密码行业标准化技术委员会分别在2014年、2015年制定了GM/T 0028-2014《密码模块安全技术要求》和GM/T ...

6057
来自专栏黄奕坤的专栏

火焰图性能调优记

最近手头开发维护的一个辅助小工具经常接到投诉可用性问题, 于是抽时间定位了下, 一看吓一跳, 起初不起眼的一个组件的日志量直接翻了两个数量级。 这怎么吃得消 !

8332
来自专栏魏琼东

AgileEAS.NET SOA中间件平台更新日志 2015-04-28

     AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平...

1050
来自专栏友弟技术工作室

浅谈LVS

集群(cluster),从字面上就知道,集与群都是多的概念。集群就是多台机器组合在一起共同完成一个需求。

1103
来自专栏Vamei实验室

协议森林14 逆袭 (CIDR与NAT)

作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载。 IPv4由于最初的设计原因,长度只有32位,所以只提供了大...

1997
来自专栏依乐祝

.NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程

上一篇文章中我带着大家进行了权限部分的极简设计,也仅仅是一个基本的权限设计。不过你完全可以基于这套权限系统设计你的更复杂的权限系统,当然更复杂的权限系统要根据你...

1702

扫码关注云+社区

领取腾讯云代金券