Python编程快速上手 — 让繁琐工作自动化<二>

在不断填坑中前进。。

Posted by 三十一 on October 30, 2017

Python编程快速上手 — 让繁琐工作自动化

处理Excel表格

使用 openpyxl.load_workbook() 打开文件。

wb = openpyxl.load_workbook('python.xlsx')

# 获取所有表名的列表
wb.get_sheet_names()
# 根据名字获取列表
sheet = wb.get_sheet_by_name('Yunis000')

# A1 单元格
c = sheet['A1']

# B10 单元格
c2 = sheet.cell(row=10, column=2)

从表中取得行和列

可以将 Worksheet 对象切片,取得电子表格中一行、一列或一个矩形区域中的所有 Cell 对象。然后可以循环遍历这个切片中的所有单元格

print(tuple(sheet['A1':'C3'])) #((<Cell 'Yunis000'.A1>, <Cell 'Yunis000'.B1>, <Cell 'Yunis000'.C1>), (<Cell 'Yunis000'.A2>, <Cell 'Yunis000'.B2>, <Cell 'Yunis000'.C2>), (<Cell 'Yunis000'.A3>, <Cell 'Yunis000'.B3>, <Cell 'Yunis000'.C3>))



for rowOfCellObjects in sheet['A1':'C3']:
    for cellObj in rowOfCellObjects:
        print(cellObj.coordinate, cellObj.value)
    print('--- END OF ROW ---')

# A1 111111111
# B1 None
# C1 None
# --- END OF ROW ---
# A2 None
# B2 None
# C2 None
# --- END OF ROW ---
# A3 None
# B3 None
# C3 None
# --- END OF ROW ---

cellObj.coordinate cell 坐标 cellObj.value cell 值

1.导入 openpyxl 模块。
2.调用 openpyxl.load_workbook()函数。
3.取得 Workbook 对象。
4.调用 get_active_sheet()或 get_sheet_by_name()工作簿方法。 
5.取得 Wor ksheet 对象。
6.使用索引或工作表的 cell()方法,带上 row 和 column 关键字参数。 
7.取得 Cell 对象。
8.读取 Cell 对象的 value 属性。

保持时间、计划任务和启动程序

  • time.time()函数
    • Unix 纪元是编程中经常参考的时间:1970 年 1 月 1 日 0 点,即协调世界时(UTC) ,time.time()函数返回自那一刻以来的秒数,是一个浮点值(回想一下,浮 点值只是一个带小数点的数)。这个数字称为 UNIX 纪元时间戳。
  • time.sleep()函数
    • 如果需要让程序暂停一下,就调用 time.sleep()函数,并传入希望程序暂停的秒数.
  • round()函数
    • 在处理时间时,你会经常遇到小数点后有许多数字的浮点值。为了让这些值更 易于处理,可以用 Python 内置的 round()函数将它们缩短,该函数按照指定的精度 四舍五入到一个浮点数。只要传入要舍入的数字,再加上可选的第二个参数,指明 需要传入到小数点后多少位。如果省略第二个参数,round()将数字四舍五入到最接 近的整数。
  • time.sleep(seconds)函数让程序暂停 seconds 参数指定的秒数。
  • datetime.datetime(year, month, day, hour, minute, second)函数返回参数指定的时刻的 datetime 对象。如果没有提供 hour、minute 或 second 参数,它们默认为 0。
  • datetime.datetime.now()函数返回当前时刻的 datetime 对象。
  • datetime.datetime.fromtimestamp(epoch)函数返回 epoch 时间戳参数表示的时刻的 datetime 对象
  • datetime.timedelta(weeks,days,hours,minutes,seconds,milliseconds, microseconds)函数返回一个表示一段时间的 timedelta 对象。该函数的关键字参数都是可选的,不包括 month 或 year。
  • total_seconds()方法用于 timedelta 对象,返回 timedelta 对象表示的秒数。
import time

def calcProd():
    product = 1
    for i in range(1,100000):
        product = product * i
    return product

startTime = time.time()
prod = calcProd()
endTime = time.time()
print('The result is %s digits long.' % (len(str(prod))))
print('Took %s seconds to calculate.' % (endTime - startTime))
time.sleep(5)

now = time.time()
print(now) #1509609194.070355
print(round(now,2)) #1509609194.07
print(round(now,4)) #1509609194.0704

超级秒表

import time

print('Press ENTER to begin. Afterwards, press ENTER to "click" the stopwatch. Press Ctrl-C to quit.')

input()
print('Started.')
# 开始时间
startTime = time.time()
# 结束时间
lastTime = startTime
lapNum = 1

try:
    while True:
        # 开始输入  当敲击回车键时  输入结束
        input()
        # 计算本次输入最后的时间
        lapTime = round(time.time() - lastTime, 2)
        # 计算总时间
        totalTime = round(time.time() - startTime, 2)
        print('Lap #%s: %s (%s)' % (lapNum, totalTime, lapTime), end='')
        lapNum += 1
        # 从新设置下次计时的时间
        lastTime = time.time() # reset the last lap time
except KeyboardInterrupt:
    # Handle the Ctrl-C exception to keep its error message from displaying.
    print('\nDone.')

多线程

创建一个线程

import threading, time

print('Start of program.')

def takeANap():
    time.sleep(2)
    print('Wake up!')

def threadArgs(arg,arg1):
    time.sleep(3)
    print(str(arg) + '  ' + str(arg1))

threadObj = threading.Thread(target=takeANap)
threadObj.start()

threadArgs = threading.Thread(target=threadArgs,args=['Yunis','三十一'])
threadArgs.start()

print('End of program.')

项目:多线程 XKCD 下载程序

# -*- coding: UTF-8 -*-
import requests, sys, webbrowser, bs4,os,threading

# 进入同级目录下
currentFilePath = sys.path[0]
os.chdir(currentFilePath)
os.makedirs('xkcd', exist_ok=True)

def downloadXkcd(startComic, endComic):
    for urlNumber in range(startComic, endComic):
        # Download the page.
        print('Downloading page http://xkcd.com/%s...' % (urlNumber))
        res = requests.get('http://xkcd.com/%s' % (urlNumber))
        res.raise_for_status()
        soup = bs4.BeautifulSoup(res.text)
        # Find the URL of the comic image.
        comicElem = soup.select('#comic img')
        if comicElem == []:
            print('Could not find comic image.')
        else:
            comicUrl = comicElem[0].get('src')
            comicUrl = 'http:' + comicUrl
            # Download the image.
            print('Downloading image %s...' % (comicUrl))
            res = requests.get(comicUrl)
            res.raise_for_status()
            # Save the image to ./xkcd.
            imageFile = open(os.path.join('xkcd',os.path.basename(comicUrl)), 'wb')
            for chunk in res.iter_content(100000):
                imageFile.write(chunk)
            imageFile.close()


# a list of all the Thread objects
downloadThreads = []
# loops 14 times, creates 14 threads
for i in range(0, 1400, 100):
     downloadThread = threading.Thread(target=downloadXkcd, args=(i, i + 99))
     downloadThreads.append(downloadThread)
     downloadThread.start()
for downloadThread in downloadThreads:
    downloadThread.join()
print('Done.')

从 Python 启动其他程序

利用内建的 subprocess 模块中的 Popen()函数,Python 程序可以启动计算机中的 其他程序(Popen()函数名中的 P 表示 process,进程)。

subprocess.Popen(['open', '/Applications/Firefox.app/'])

import time, subprocess
print('Start')
timeLeft = 5
while timeLeft > 0:
    print('Left')
    print(timeLeft, end='')
    time.sleep(1)
    timeLeft = timeLeft - 1

print('Play')
subprocess.Popen(['open', '/Users/Yunis/Documents/Github/LearnPython/Python/Time/01.mp3'])

发送电子邮件

#coding: utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header



sender = 'xxx@163.com'
receiver = 'xxx@qq.com'
subject = '大家好'
smtpserver = 'smtp.163.com'
username = 'xxx'
password = 'xxxx'

msg = MIMEText('你这是什么情况','plain','utf-8')#中文需参数‘utf-8',单字节字符不需要
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = 'Yunis<yunis_song@163.com>'
msg['To'] = "Yunis<332963965@qq.com>"


try:
    smtp = smtplib.SMTP()
    smtp.connect('smtp.163.com',25)
    smtp.login(username, password)
    smtp.sendmail(sender, receiver, msg.as_string())

    print ("邮件发送成功")
    smtp.quit()
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")
    print (smtplib.SMTPException.message)