day59——数据处理
csv数据处理
Csv文件格式: 看下.csv文件的定义: 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。 如一下格式:27,20,14,15,14,12,94,64,37,1015,1013,1009,7,5,2,21,8,35,0.00,,,152 .csv文件可以直接用excel或者类似软件打开,样子都是我们常见的表格形式。
1 代码处理: 2 import csv 3 fileName = 'weather.csv' 4 with open(fileName, "r", encoding="utf-8") as f: 5 text = csv.reader(f) 6 for i in text: 7 print(i) 8 print("####"*10) 9 with open(fileName, "r", encoding="utf-8") as f: 10 for i in f.readlines(): 11 print(i.split(","))
python提供有第三方库来支持对excel的操作,python处理excel文件用的第三方模块库有xlrd、xlwt、xluntils和pyExcelerator,除此之外,python处理excel还可以用win32com和openpyxl模块。下面我们先安装第三方库
Pip install xlrd
Pip install xlwt
Pip install xluntils
Pip install pyExcelerator
Xlrd只能进行读取excel文件,没法进行写入文件,xlwt可以写入文件,但是不能在已有的excel的文件上进行修改,如果有这个需求,就需要使用xluntils模块了,pyExcelerator模块与xlwt类似,也可以用来生成excel文件
1 读取单表文件: 2 import xlrd 3 4 def readExcel(): 5 data = xlrd.open_workbook('test.xlsx') 6 table = data.sheets()[0] # 打开第一张表 7 nrows = table.nrows # 获取表的行数 8 for i in range(nrows): # 循环逐行打印 9 print(table.row_values(i))#通过row_values来获取每行的值 10 11 readExcel()
1 读取单表文件复杂例子: 2 # 打开一个workbook 3 workbook = xlrd.open_workbook('testdata.xlsx') 4 # 抓取所有sheet页的名称 5 worksheets = workbook.sheet_names() 6 print(workbook.sheets()) 7 print('worksheets is {0}'.format(worksheets)) 8 # 定位到sheet1 9 # worksheet1 = workbook.sheet_by_name(u'Sheet1') 10 worksheet1 = workbook.sheets()[1] 11 """ 12 #通过索引顺序获取 13 worksheet1 = workbook.sheets()[0] 14 """ 15 """ 16 #遍历所有sheet对象 17 for worksheet_name in worksheets: 18 worksheet = workbook.sheet_by_name(worksheet_name) 19 """ 20 # 遍历sheet1中所有行row 21 num_rows = worksheet1.nrows 22 for curr_row in range(num_rows): 23 row = worksheet1.row_values(curr_row) 24 print('row%s is %s' % (curr_row, row)) 25 # 遍历sheet1中所有列col 26 num_cols = worksheet1.ncols 27 for curr_col in range(num_cols): 28 col = worksheet1.col_values(curr_col) 29 print('col%s is %s' % (curr_col, col)) 30 # 遍历sheet1中所有单元格cell 31 for rown in range(num_rows): 32 for coln in range(num_cols): 33 cell = worksheet1.cell_value(rown, coln) 34 print(cell)
1 写入excel文件 2 import xlwt 3 #创建workbook和sheet对象 4 workbook = xlwt.Workbook() #注意Workbook的开头W要大写 5 sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True) 6 sheet2 = workbook.add_sheet('sheet2', cell_overwrite_ok=True) 7 sheet3 = workbook.add_sheet('sheet3', cell_overwrite_ok=True) 8 #向sheet页中写入数据 9 sheet1.write(0,0,'this should overwrite1') 10 sheet1.write(0,1,'aaaaaaaaaaaa') 11 sheet2.write(0,0,'this should overwrite2') 12 sheet2.write(1,2,'bbbbbbbbbbbbb') 13 14 #-----------使用样式----------------------------------- 15 #初始化样式 16 style = xlwt.XFStyle() 17 #为样式创建字体 18 font = xlwt.Font() 19 font.name = 'Times New Roman' 20 font.bold = True 21 #设置样式的字体 22 style.font = font 23 #使用样式 24 sheet3.write(0,1,'some bold Times text',style) 25 26 #保存该excel文件,有同名文件时直接覆盖 27 workbook.save('test2.xls') 28 print('创建excel文件完成!')
Excele来处理超链接
1 import codecs 2 import xlwt 3 book = xlwt.Workbook() 4 sheet_index = book.add_sheet('index') 5 line=0 6 for i in range(9): 7 link = 'HYPERLINK("{0}.txt", "{1}_11111")'.format(i, i) 8 sheet_index.write(line, 0, xlwt.Formula(link)) 9 line += 1 10 book.save('simple2.xls') 11 for i in range(0, 9): 12 file = str(i) + ".txt" 13 with codecs.open(file, 'w') as f: 14 f.write(str(i)*10)
Python进行修改excel文件:
但是不支持使用xlsx文件,直接使用xlsx就没有问题,如果使用xlsx文件,容易发生问题。
import xlrd
import xlutils.copy
#打开一个workbook
rb = xlrd.open_workbook('aaa111.xls')
wb = xlutils.copy.copy(rb)
#获取sheet对象,通过sheet_by_index()获取的sheet对象没有write()方法
ws = wb.get_sheet(0)
#写入数据
ws.write(10, 10, 'changed!')
#添加sheet页
wb.add_sheet('sheetnnn2',cell_overwrite_ok=True)
#利用保存时同名覆盖达到修改excel文件的目的,注意未被修改的内容保持不变
wb.save('aaa111.xls')
Python处理pdf文件
1 Python读出pdf文件 2 #!/usr/bin/env python 3 # -*- coding: utf-8 -*- 4 # @Time : 2018/1/10 14:46 5 # @Author : lingxiangxiang 6 # @File : demon1.py 7 from pdfminer.pdfparser import PDFParser, PDFDocument 8 from pdfminer.pdfparser import PDFPage 9 from pdfminer.pdfinterp import PDFResourceManager, PDFTextExtractionNotAllowed 10 from pdfminer.pdfinterp import PDFPageInterpreter 11 from pdfminer.pdfdevice import PDFDevice 12 from pdfminer.layout import LAParams 13 from pdfminer.converter import PDFPageAggregator 14 #获取文档对象,你把algorithm.pdf换成你自己的文件名即可。 15 fp=open("test.pdf","rb") 16 #创建一个与文档相关联的解释器 17 parser=PDFParser(fp) 18 #PDF文档对象,提供密码初始化,没有就不用带password参数。 19 doc=PDFDocument() 20 21 parser.set_document(doc) 22 doc.set_parser(parser) 23 24 doc.initialize() 25 #检查文件是否允许文本提取 26 if not doc.is_extractable: 27 raise PDFTextExtractionNotAllowed 28 #链接解释器和文档对象 29 # parser.set_document(doc) 30 #doc.set_paeser(parser) 31 #初始化文档 32 #doc.initialize("") 33 #创建PDF资源管理器对象来存储共享资源 34 resource=PDFResourceManager() 35 #参数分析器 36 laparam=LAParams() 37 #创建一个聚合器 38 device=PDFPageAggregator(resource, laparams=laparam) 39 #创建PDF页面解释器 40 interpreter=PDFPageInterpreter(resource,device) 41 #使用文档对象得到页面集合 42 for page in doc.get_pages(): 43 #使用页面解释器来读取 44 interpreter.process_page(page) 45 #使用聚合器来获取内容 46 layout=device.get_result() 47 for out in layout: 48 if hasattr(out, "get_text"): 49 print(out.get_text())
Html转pdf文件
转换成pdf的三种方法: 在工作中,我们可能会遇到把html文件转换成pdf文件,而python给我们提供了pdfkit这个模块,我们直接安装使用就可以了,下面我们就下来介绍一个pdfkit模块的几种用法,
首先,我们安装该模块:
pip install pdfkit
1.网页转换成pdf 直接把url转换成pdf文件 import pdfkit pdfkit.from_url('http://google.com', 'out1.pdf')
2. Html转换成pdf Import pdfkit pdfkit.from_file('test.html', 'out2.pdf')
3. 字符创转换成pdf Import pdfkit pdfkit.from_string('Hello lingxiangxiang!', 'out3.pdf')
抓取aming的linux教程,然后制作成pdf文件
先抓取每个的网页,然后生成pdf文件
1 import codecs 2 import os 3 import sys 4 5 import pdfkit 6 import requests 7 8 base_url = 'http://www.apelearn.com/study_v2/' 9 if not os.path.exists("aming"): 10 os.mkdir("aming") 11 12 os.chdir("aming") 13 s = requests.session() 14 15 for i in range(1, 27): 16 url = base_url + 'chapter' + str(i) + '.html' 17 print(url) 18 file = str(i) + '.pdf' 19 print(file) 20 config = pdfkit.configuration(wkhtmltopdf=r"D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe") 21 try: 22 pdfkit.from_url(url, file) 23 except: 24 continue
合并多个pdf文件为一个pdf文件
1 import PyPDF2 2 import os 3 #建立一个装pdf文件的数组 4 pdfFiles = [] 5 for fileName in os.listdir('aming'): #遍历该程序所在文件夹内的文件 6 if fileName.endswith('.pdf'): #找到以.pdf结尾的文件 7 pdfFiles.append(fileName) #将pdf文件装进pdfFiles数组内 8 # pdfFiles.sort() #文件排序 9 print(pdfFiles) 10 os.chdir("aming") 11 pdfWriter = PyPDF2.PdfFileWriter() #生成一个空白的pdf文件 12 for fileName in pdfFiles: 13 pdfReader = PyPDF2.PdfFileReader(open(fileName,'rb')) #以只读方式依次打开pdf文件 14 for pageNum in range(pdfReader.numPages): 15 print(pdfReader.getPage(pageNum)) 16 pdfWriter.addPage(pdfReader.getPage(pageNum)) #将打开的pdf文件内容一页一页的复制到新建的空白pdf里 17 pdfOutput = open('combine.pdf','wb') #生成combine.pdf文件 18 pdfWriter.write(pdfOutput) #将复制的内容全部写入combine.pdf 19 pdfOutput.close()
Python处理图片
图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是 Python 中最常用的图像处理库,如果你是python2.x,可以通过以下地址进行下载:http://www.pythonware.com/products/pil/index.htm,找到相对应的版本进行下载就可以了。
注意:PIL模块在python3.x中已经替换成pillow模块,文档地址:http://pillow.readthedocs.io/en/latest/,直接使用pip3 install pillow即可安装模块,导入时使用from PIL import Image.
1 from PIL import Image 2 image = Image.open("1.jpg") 3 print(image.format, image.size, image.mode) 4 image.show()
结果: JPEG (1080, 1920) RGB
并把图片打开,展示出来
Image的三个属性:
format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值。
size : 返回的一个元组,有两个元素,其值为象素意义上的宽和高。
mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。
Image的方法介绍:
show():显示最近加载的图像
open(infilename): 打开文件
save(outfilename):保存文件
crop((left, upper, right, lower)):从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。
Image的几何处理:
out = im.resize((128, 128)) #调整图片大小
out = im.rotate(45) #逆时针旋转 45 度角。
out = im.transpose(Image.FLIP_LEFT_RIGHT) #左右对换。
out = im.transpose(Image.FLIP_TOP_BOTTOM) #上下对换。
out = im.transpose(Image.ROTATE_90) #旋转 90 度角。
out = im.transpose(Image.ROTATE_180) #旋转 180 度角。
out = im.transpose(Image.ROTATE_270) #旋转 270 度角。
例子1:抠图 需求,把头像给截图出来:
1 from PIL import Image 2 image = Image.open("1.jpg") 3 print(image.format, image.size, image.mode) 4 box = (600, 300, 1050, 660) 5 region = image.crop(box) 6 region.save("cutting.jpg")
例子2:图片拼合
1 from PIL import Image 2 image = Image.open("1.jpg") 3 print(image.format, image.size, image.mode) 4 box = (600, 300, 1050, 660) 5 egion = image.crop(box) 6 #egion.save("cutting.jpg") 7 region = egion.transpose(Image.ROTATE_180) 8 image.paste(region, box) 9 image.show()
把头像照片截取出来,然后调换头像照片180度,然后在拼接在一起,
上述代码讲图片的((600, 300), (600, 660), (1050, 300), (1050, 660))所画出来的区域进行裁剪,并保存在cutting.jpg中
例子3:缩放:
1 from PIL import Image 2 3 infile = "2.jpg" 4 outfile = "new2.jpg" 5 image = Image.open(infile) 6 (x, y) = image.size 7 newx = 300 8 newy = int(y*newx/x) 9 out = image.resize((newx, newy), Image.ANTIALIAS) 10 out.show()
例子4:验证码
1 import random 2 import string 3 import sys 4 import math 5 from PIL import Image, ImageDraw, ImageFont, ImageFilter 6 7 # 字体的位置,不同版本的系统会有不同 8 font_path = 'msyh.ttf' 9 # 生成几位数的验证码 10 number = 4 11 # 生成验证码图片的高度和宽度 12 size = (100, 30) 13 # 背景颜色,默认为白色 14 bgcolor = (255, 255, 255) 15 # 字体颜色,默认为蓝色 16 fontcolor = (0, 0, 255) 17 # 干扰线颜色。默认为红色 18 linecolor = (255, 0, 0) 19 # 是否要加入干扰线 20 draw_line = True 21 # 加入干扰线条数的上下限 22 line_number = 20 23 24 25 # 用来随机生成一个字符串 26 def gene_text(): 27 source = list(string.ascii_letters) 28 for index in range(0, 10): 29 source.append(str(index)) 30 return ''.join(random.sample(source, number)) # number是生成验证码的位数 31 32 33 # 用来绘制干扰线 34 def gene_line(draw, width, height): 35 begin = (random.randint(0, width), random.randint(0, height)) 36 end = (random.randint(0, width), random.randint(0, height)) 37 draw.line([begin, end], fill=linecolor) 38 39 40 # 生成验证码 41 def gene_code(): 42 width, height = size # 宽和高 43 image = Image.new('RGBA', (width, height), bgcolor) # 创建图片 44 font = ImageFont.truetype(font_path, 25) # 验证码的字体 45 draw = ImageDraw.Draw(image) # 创建画笔 46 text = gene_text() # 生成字符串 47 font_width, font_height = font.getsize(text) 48 draw.text(((width - font_width) / number, (height - font_height) / number), text, font=font, fill=fontcolor) # 填充字符串 49 if draw_line: 50 for i in range(line_number): 51 gene_line(draw, width, height) 52 53 # image = image.transform((width + 20, height + 10), Image.AFFINE, (1, -0.3, 0, -0.1, 1, 0), Image.BILINEAR) # 创建扭曲 54 image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强 55 image.save('idencode.png') # 保存验证码图片 56 # image.show() 57 58 59 if __name__ == "__main__": 60 gene_code()