The Seven Year Itch.

MENU

python内容识别

May 30, 2017 • Read: 295 • Python


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


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

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

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

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

解决问题:
一、寻找一些特征特征
(1)我们可以看到数据中有--my类似这样的特殊符号的标识。这下面跟着的就是有效的数据。所以我们先记录下来,用来切片。--my-my-my-boundary-my-my-my
(2)然后我在有效数据块的结尾都会看到一串类似这样的标识符。标识符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()

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


程序加工:

 # -*- 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
QR Code for this page
Tipping QR Code