Python之數據處理

1、CSV數據處理html

  CSV文件格式:逗號分隔值(Comma-Separated Value,CSV,有時也稱爲字符分隔值,由於分隔符也能夠不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。純文本意味着該文件是一個字符序列,不含必須像二進制數字那樣被解讀的數據。CSV文件由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最多見的是逗號或製表符。一般,全部記錄都有徹底相同的字段序列。如如下格式:python

  27,20,14,15,12,94,13,16,988,1015,0.00,152數組

  csv文件能夠直接用Excel或者相似軟件打開,樣子都是咱們常見的表格格式。session

  代碼例子:app

import csv
fileName = 'weather.csv'
with open(fileName, "r", encoding="utf-8") as f:
    text = csv.reader(f)
    for i in text:
        print(i)
print("####"*10)
with open(fileName, "r", encoding="utf-8") as f:
    for i in f.readlines():
        print(i.split(","))

2、Excel數據處理dom

  Python提供有第三方庫來支持對exec的操做,Python處理Excel文件用的第三方模塊庫有xlrd、xlwt、xluntils和pyExcelerator,除此以外,Python處理Excel還能夠用win32com和openpyxl模塊。ide

  須要先安裝第三方庫:pip install xlrd     pip install xlwt   pip install xluntils    pip install  pyExcelrator字體

  xlrd:讀取我Excel文件this

  xlwt:寫入文件,可是不能在已有的Excel的文件進行修改,若是有這個需求,就須要使用xluntils模塊了。google

  pyExcelerator模塊與xlwt相似,也能夠用來生成Excel文件

  1.讀取單表文件:

def readExcel():
    data = xlrd.open_workbook('test.xlsx')
    table = data.sheets()[0] # 打開第一張表
    nrows = table.nrows # 獲取表的行數
    for i in range(nrows): # 循環逐行打印
        print(table.row_values(i))#經過row_values來獲取每行的值

readExcel()
# 打開一個workbook
workbook = xlrd.open_workbook('testdata.xlsx')
# 抓取全部sheet頁的名稱
worksheets = workbook.sheet_names()
print(workbook.sheets())
print('worksheets is {0}'.format(worksheets))
# 定位到sheet1
# worksheet1 = workbook.sheet_by_name(u'Sheet1')
worksheet1 = workbook.sheets()[1]
"""
#經過索引順序獲取
worksheet1 = workbook.sheets()[0]
"""
"""
#遍歷全部sheet對象
for worksheet_name in worksheets:
worksheet = workbook.sheet_by_name(worksheet_name)
"""
# 遍歷sheet1中全部行row
num_rows = worksheet1.nrows
for curr_row in range(num_rows):
    row = worksheet1.row_values(curr_row)
    print('row%s is %s' % (curr_row, row))
# 遍歷sheet1中全部列col
num_cols = worksheet1.ncols
for curr_col in range(num_cols):
    col = worksheet1.col_values(curr_col)
    print('col%s is %s' % (curr_col, col))
# 遍歷sheet1中全部單元格cell
for rown in range(num_rows):
    for coln in range(num_cols):
        cell = worksheet1.cell_value(rown, coln)
        print(cell)

  2.寫入Excel文件

import xlwt
#建立workbook和sheet對象
workbook = xlwt.Workbook() #注意Workbook的開頭W要大寫
sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
sheet2 = workbook.add_sheet('sheet2', cell_overwrite_ok=True)
sheet3 = workbook.add_sheet('sheet3', cell_overwrite_ok=True)
#向sheet頁中寫入數據
sheet1.write(0,0,'this should overwrite1')
sheet1.write(0,1,'aaaaaaaaaaaa')
sheet2.write(0,0,'this should overwrite2')
sheet2.write(1,2,'bbbbbbbbbbbbb')

#-----------使用樣式-----------------------------------
#初始化樣式
style = xlwt.XFStyle()
#爲樣式建立字體
font = xlwt.Font()
font.name = 'Times New Roman'
font.bold = True
#設置樣式的字體
style.font = font
#使用樣式
sheet3.write(0,1,'some bold Times text',style)

#保存該excel文件,有同名文件時直接覆蓋
workbook.save('test2.xls')
print('建立excel文件完成!')

  3.Excel處理超連接

import codecs
import xlwt
book = xlwt.Workbook()
sheet_index = book.add_sheet('index')
line=0
for i in range(9):
    link = 'HYPERLINK("{0}.txt", "{1}_11111")'.format(i, i)
    sheet_index.write(line, 0, xlwt.Formula(link))
    line += 1
book.save('simple2.xls')
for i in range(0, 9):
    file = str(i) + ".txt"
    with codecs.open(file, 'w') as f:
        f.write(str(i)*10)

  4.修改Excel文件,須要注意的是不支持使用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')

 

3、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文件

import codecs
import os
import sys

import pdfkit
import requests

base_url = 'http://www.apelearn.com/study_v2/'
if not os.path.exists("aming"):
    os.mkdir("aming")

os.chdir("aming")
s = requests.session()

for i in range(1, 27):
    url = base_url + 'chapter' + str(i) + '.html'
    print(url)
    file = str(i) + '.pdf'
    print(file)
    config = pdfkit.configuration(wkhtmltopdf=r"D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe")
    try:
        pdfkit.from_url(url, file)
    except:
        continue

 4、Python處理PDF文件

  Python讀出PDF文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/1/10 14:46
# @Author  : lingxiangxiang
# @File    : demon1.py
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfparser import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
#獲取文檔對象,你把algorithm.pdf換成你本身的文件名便可。
fp=open("test.pdf","rb")
#建立一個與文檔相關聯的解釋器
parser=PDFParser(fp)
#PDF文檔對象,提供密碼初始化,沒有就不用帶password參數。
doc=PDFDocument()

parser.set_document(doc)
doc.set_parser(parser)

doc.initialize()
#檢查文件是否容許文本提取
if not doc.is_extractable:
    raise PDFTextExtractionNotAllowed
#連接解釋器和文檔對象
# parser.set_document(doc)
#doc.set_paeser(parser)
#初始化文檔
#doc.initialize("")
#建立PDF資源管理器對象來存儲共享資源
resource=PDFResourceManager()
#參數分析器
laparam=LAParams()
#建立一個聚合器
device=PDFPageAggregator(resource, laparams=laparam)
#建立PDF頁面解釋器
interpreter=PDFPageInterpreter(resource,device)
#使用文檔對象獲得頁面集合
for page in doc.get_pages():
  #使用頁面解釋器來讀取
  interpreter.process_page(page)
  #使用聚合器來獲取內容
  layout=device.get_result()
  for out in layout:
    if hasattr(out, "get_text"):
      print(out.get_text())

  合併多個PDF文件爲一個PDF文件

import PyPDF2
import os
#創建一個裝pdf文件的數組
pdfFiles = []
for fileName in os.listdir('aming'):    #遍歷該程序所在文件夾內的文件
    if fileName.endswith('.pdf'):   #找到以.pdf結尾的文件
        pdfFiles.append(fileName)   #將pdf文件裝進pdfFiles數組內
# pdfFiles.sort()     #文件排序
print(pdfFiles)
os.chdir("aming")
pdfWriter = PyPDF2.PdfFileWriter()     #生成一個空白的pdf文件
for fileName in pdfFiles:
    pdfReader = PyPDF2.PdfFileReader(open(fileName,'rb'))   #以只讀方式依次打開pdf文件
    for pageNum in range(pdfReader.numPages):                    
    print(pdfReader.getPage(pageNum))
    pdfWriter.addPage(pdfReader.getPage(pageNum))
#將打開的pdf文件內容一頁一頁的複製到新建的空白pdf裏 pdfOutput = open('combine.pdf','wb') #生成combine.pdf文件pdfWriter.write(pdfOutput)
#將複製的內容所有寫入combine.pdfpdfOutput.close()

5、Python處理圖片

  圖片處理是一門應用很是廣的技術,而擁有很是豐富第三方擴展庫的Python固然不會錯過這一門盛宴。PIL(Python Imaging Library)是Python中最經常使用的圖像處理庫。若是是Python2.x,能夠經過如下地址進行下載:http://www.pythonware.com/products/pil/index.html,找到相應的版本進行下載。

  注意:PIL模塊在Python3中已經替換成pillow模塊,文檔地址:http://pillow.readthedocs.io/en/latest/,直接使用pip3 install pillow便可安裝模塊。導入時使用from PIL import Image

  打開圖片

from PIL import Image

image = Image.open("1.jpg")
print(image.format, image.size, image.mode)
image.show()

  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)是左上角

  例子1:摳圖:把頭像給截圖出來

from PIL import Image
image = Image.open("1.jpg")
print(image.format, image.size, image.mode)
box = (600, 300, 1050, 660)
region = image.crop(box)
region.save("cutting.jpg")

  例子2:圖片拼合

from PIL import Image
image = Image.open("1.jpg")
print(image.format, image.size, image.mode)
box = (600, 300, 1050, 660)
egion = image.crop(box)
#egion.save("cutting.jpg")
region = egion.transpose(Image.ROTATE_180)
image.paste(region, box)
image.show()

  例子3:縮放

from PIL import Image

infile = "2.jpg"
outfile = "new2.jpg"
image = Image.open(infile)
(x, y) = image.size
newx = 300
newy = int(y*newx/x)
out = image.resize((newx, newy), Image.ANTIALIAS)
out.show()

  例子4:驗證碼

import random
import string
import sys
import math
from PIL import Image, ImageDraw, ImageFont, ImageFilter

# 字體的位置,不一樣版本的系統會有不一樣
font_path = 'msyh.ttf'
# 生成幾位數的驗證碼
number = 4
# 生成驗證碼圖片的高度和寬度
size = (100, 30)
# 背景顏色,默認爲白色
bgcolor = (255, 255, 255)
# 字體顏色,默認爲藍色
fontcolor = (0, 0, 255)
# 干擾線顏色。默認爲紅色
linecolor = (255, 0, 0)
# 是否要加入干擾線
draw_line = True
# 加入干擾線條數的上下限
line_number = 20


# 用來隨機生成一個字符串
def gene_text():
    source = list(string.ascii_letters)
    for index in range(0, 10):
        source.append(str(index))
    return ''.join(random.sample(source, number))  # number是生成驗證碼的位數


# 用來繪製干擾線
def gene_line(draw, width, height):
    begin = (random.randint(0, width), random.randint(0, height))
    end = (random.randint(0, width), random.randint(0, height))
    draw.line([begin, end], fill=linecolor)


# 生成驗證碼
def gene_code():
    width, height = size  # 寬和高
    image = Image.new('RGBA', (width, height), bgcolor)  # 建立圖片
    font = ImageFont.truetype(font_path, 25)  # 驗證碼的字體
    draw = ImageDraw.Draw(image)  # 建立畫筆
    text = gene_text()  # 生成字符串
    font_width, font_height = font.getsize(text)
    draw.text(((width - font_width) / number, (height - font_height) / number), text, font=font, fill=fontcolor)  # 填充字符串
    if draw_line:
        for i in range(line_number):
            gene_line(draw, width, height)

    # image = image.transform((width + 20, height + 10), Image.AFFINE, (1, -0.3, 0, -0.1, 1, 0), Image.BILINEAR)  # 建立扭曲
    image = image.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 濾鏡,邊界增強
    image.save('idencode.png')  # 保存驗證碼圖片
    # image.show()


if __name__ == "__main__":
    gene_code()
相關文章
相關標籤/搜索