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)