首先,这次又是一个公司的一个任务。任务的要求是将截图中的数据给提取出来,这里面的数据都是不一样的。测试文件为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