目录
21. 创建一个简单的秒表
22.压缩文件夹和文件的Python脚本
23. 查找 IMDB 评级
如何运行脚本?
24. 网页抓取 Youtube 评论
25. 文字转语音
先决条件
26. 转换图像格式
27.随机维基百科文章
安装
28. 检查网站连接
29. # 当前天气
要求
30.GUI计算器应用程序
建议收藏备用
import tkinter as Tkinter
from datetime import datetime
counter = 0
running = False
def counter_label(label):
def count():
if running:
global counter
# To manage the intial delay.
if counter == 0:
display = 'Ready!'
else:
tt = datetime.utcfromtimestamp(counter)
string = tt.strftime('%H:%M:%S')
display = string
label['text'] = display
# label.after(arg1, arg2) delays by
# first argument given in milliseconds
# and then calls the function given as second argument.
# Generally like here we need to call the
# function in which it is present repeatedly.
# Delays by 1000ms=1 seconds and call count again.
label.after(1000, count)
counter += 1
# Triggering the start of the counter.
count()
# start function of the stopwatch
def Start(label):
global running
running = True
counter_label(label)
start['state'] = 'disabled'
stop['state'] = 'normal'
reset['state'] = 'normal'
# Stop function of the stopwatch
def Stop():
global running
start['state'] = 'normal'
stop['state'] = 'disabled'
reset['state'] = 'normal'
running = False
# Reset function of the stopwatch
def Reset(label):
global counter
counter = 0
# If reset is pressed after pressing stop.
if not running:
reset['state'] = 'disabled'
label['text'] = '00:00:00'
# If reset is pressed while the stopwatch is running.
else:
label['text'] = '00:00:00'
root = Tkinter.Tk()
root.title("Stopwatch")
# Fixing the window size.
root.minsize(width=250, height=70)
label = Tkinter.Label(root, text='Ready!', fg='black', font='Verdana 30 bold')
label.pack()
f = Tkinter.Frame(root)
start = Tkinter.Button(f, text='Start', width=6, command=lambda: Start(label))
stop = Tkinter.Button(f, text='Stop', width=6, state='disabled', command=Stop)
reset = Tkinter.Button(f, text='Reset', width=6, state='disabled', command=lambda: Reset(label))
f.pack(anchor='center', pady=5)
start.pack(side='left')
stop.pack(side='left')
reset.pack(side='left')
root.mainloop()
import zipfile
import sys
import os
# compress file function
def zip_file(file_path):
compress_file = zipfile.ZipFile(file_path + '.zip', 'w')
compress_file.write(path, compress_type=zipfile.ZIP_DEFLATED)
compress_file.close()
# Declare the function to return all file paths of the particular directory
def retrieve_file_paths(dir_name):
# setup file paths variable
file_paths = []
# Read all directory, subdirectories and file lists
for root, directories, files in os.walk(dir_name):
for filename in files:
# Create the full file path by using os module.
file_path = os.path.join(root, filename)
file_paths.append(file_path)
# return all paths
return file_paths
def zip_dir(dir_path, file_paths):
# write files and folders to a zipfile
compress_dir = zipfile.ZipFile(dir_path + '.zip', 'w')
with compress_dir:
# write each file separately
for file in file_paths:
compress_dir.write(file)
if __name__ == "__main__":
path = sys.argv[1]
if os.path.isdir(path):
files_path = retrieve_file_paths(path)
# print the list of files to be zipped
print('The following list of files will be zipped:')
for file_name in files_path:
print(file_name)
zip_dir(path, files_path)
elif os.path.isfile(path):
print('The %s will be zipped:' % path)
zip_file(path)
else:
print('a special file(socket,FIFO,device file), please input file or dir')
此脚本用于检索电影文件夹中与 IMDb 上的电影的评级和类型相匹配的电影的评级和类型;数据从 IMDB 官方网站抓取并保存在 CSV 文件中。
然后,CSV 文件可用于分析、按评级排序等。
from bs4 import BeautifulSoup
import requests
import pandas as pd
import os
# Setting up session
s = requests.session()
# List contaiting all the films for which data has to be scraped from IMDB
films = []
# Lists contaiting web scraped data
names = []
ratings = []
genres = []
# Define path where your films are present
# For eg: "/Users/utkarsh/Desktop/films"
path = input("Enter the path where your films are: ")
# Films with extensions
filmswe = os.listdir(path)
for film in filmswe:
# Append into my films list (without extensions)
films.append(os.path.splitext(film)[0])
# print(os.path.splitext(film)[0])
for line in films:
# x = line.split(", ")
title = line.lower()
# release = x[1]
query = "+".join(title.split())
URL = "https://www.imdb.com/search/title/?title=" + query
print(URL)
# print(release)
try:
response = s.get(URL)
#getting contect from IMDB Website
content = response.content
# print(response.status_code)
soup = BeautifulSoup(response.content, features="html.parser")
#searching all films containers found
containers = soup.find_all("div", class_="lister-item-content")
for result in containers:
name1 = result.h3.a.text
name = result.h3.a.text.lower()
# Uncomment below lines if you want year specific as well, define year variable before this
# year = result.h3.find(
# "span", class_="lister-item-year text-muted unbold"
# ).text.lower()
#if film found (searching using name)
if title in name:
#scraping rating
rating = result.find("div",class_="inline-block ratings-imdb-rating")["data-value"]
#scraping genre
genre = result.p.find("span", class_="genre")
genre = genre.contents[0]
#appending name, rating and genre to individual lists
names.append(name1)
ratings.append(rating)
genres.append(genre)
except Exception:
print("Try again with valid combination of tile and release year")
#storing in pandas dataframe
df = pd.DataFrame({'Film Name':names,'Rating':ratings,'Genre':genres})
#making csv using pandas
df.to_csv('film_ratings.csv', index=False, encoding='utf-8')
该脚本将获取 YouTube 视频的 URL,并为用户和评论提供 CSV 文件。
from selenium import webdriver
import csv
import time
items=[]
driver=webdriver.Chrome(r"C:/Users/hp/Anaconda3/chromedriver.exe")
driver.get('https://www.youtube.com/watch?v=iFPMz36std4')
driver.execute_script('window.scrollTo(1, 500);')
#now wait let load the comments
time.sleep(5)
driver.execute_script('window.scrollTo(1, 3000);')
username_elems = driver.find_elements_by_xpath('//*[@id="author-text"]')
comment_elems = driver.find_elements_by_xpath('//*[@id="content-text"]')
for username, comment in zip(username_elems, comment_elems):
item = {}
item['Author'] = username.text
item['Comment'] = comment.text
items.append(item)
filename = 'C:/Users/hp/Desktop/commentlist.csv'
with open(filename, 'w', newline='', encoding='utf-8') as f:
w = csv.DictWriter(f,['Author','Comment'])
w.writeheader()
for item in items:
w.writerow(item)
执行时,abc.txt 中的文本将转换为 mp3、保存,然后在您的设备上播放。
from gtts import gTTS
import os
file = open("abc.txt", "r").read()
speech = gTTS(text=file, lang='en', slow=False)
speech.save("voice.mp3")
os.system("voice.mp3")
该脚本将递归地将当前目录树中的所有 JPG 图像转换为 PNG,并将 PNG 图像转换为 JPG(即也会更改子目录中图像的格式。)
from PIL import Image
import sys
import os
try:
im = None
for root, dirs, files in os.walk("."):
for filename in files:
if filename.endswith('.jpg'):
im = Image.open(filename).convert("RGB")
im.save(filename.replace('jpg', 'png'), "png")
elif filename.endswith('.png'):
im = Image.open(filename).convert("RGB")
im.save(filename.replace('png', 'jpg'), "jpeg")
else:
print('dont have image to convert')
except IOError:
print('directory empty!')
sys.exit()
用于将维基百科中的任何随机文章保存到文本文件的应用程序。
pip install htmlparser
pip install beautifulsoup4
from bs4 import BeautifulSoup
import requests
# Trying to open a random wikipedia article
# Special:Random opens random articles
res = requests.get("https://en.wikipedia.org/wiki/Special:Random")
res.raise_for_status()
# pip install htmlparser
wiki = BeautifulSoup(res.text, "html.parser")
r = open("random_wiki.txt", "w+", encoding='utf-8')
# Adding the heading to the text file
heading = wiki.find("h1").text
r.write(heading + "\n")
for i in wiki.select("p"):
# Optional Printing of text
# print(i.getText())
r.write(i.getText())
r.close()
print("File Saved as random_wiki.txt")
该脚本包含一个用于检查网站连接的基本实用程序。
输入文件websites.txt 中应每行列出一个网站URL。
输出文件 website status.csv 中包含两列报告,其中包含每个测试站点的 URL 及其状态。
该脚本仅检查来自网络服务器的 200 状态代码。
每次运行该实用程序时,结果文件都会被覆盖。
import csv
import requests
status_dict = {"Website": "Status"}
def main():
with open("websites.txt", "r") as fr:
for line in fr:
website = line.strip()
status = requests.get(website).status_code
status_dict[website] = "working" if status == 200 \
else "not working"
# print(status_dict)
with open("website_status.csv", "w", newline="") as fw:
csv_writers = csv.writer(fw)
for key in status_dict.keys():
csv_writers.writerow([key, status_dict[key]])
if __name__ == "__main__":
main()
该脚本将帮助您查找任何输入地点的当前天气。该脚本使用 openweathermap.org 来查找当前天气。
要运行此脚本,您需要有 api 密钥,要获取 API 密钥,您首先 在此处注册
获取api key后在代码中添加:
# Python program to find current weather details of any city using openweathermap api
import requests
# Enter your API key here
api_key = "Your_API_Key"
# base_url variable to store url
base_url = "http://api.openweathermap.org/data/2.5/weather?"
# Give city name
city_name = input("Enter city name : ")
complete_url = base_url + "appid=" + api_key + "&q=" + city_name
response = requests.get(complete_url)
x = response.json()
if x["cod"] != "404":
y = x["main"]
current_temperature = y["temp"]
current_pressure = y["pressure"]
current_humidiy = y["humidity"]
z = x["weather"]
weather_description = z[0]["description"]
print(" Temperature (in kelvin unit) = " +
str(current_temperature) +
"\n atmospheric pressure (in hPa unit) = " +
str(current_pressure) +
"\n humidity (in percentage) = " +
str(current_humidiy) +
"\n description = " +
str(weather_description))
else:
print(" City Not Found ")
# -*- coding: utf-8 -*-
from tkinter import Tk, END, Entry, N, E, S, W, Button
from tkinter import font
from tkinter import Label
from functools import partial
def get_input(entry, argu):
entry.insert(END, argu)
def backspace(entry):
input_len = len(entry.get())
entry.delete(input_len - 1)
def clear(entry):
entry.delete(0, END)
def calc(entry):
input_info = entry.get()
try:
output = str(eval(input_info.strip()))
except ZeroDivisionError:
popupmsg()
output = ""
clear(entry)
entry.insert(END, output)
def popupmsg():
popup = Tk()
popup.resizable(0, 0)
popup.geometry("120x100")
popup.title("Alert")
label = Label(popup, text="Cannot divide by 0 ! \n Enter valid values")
label.pack(side="top", fill="x", pady=10)
B1 = Button(popup, text="Okay", bg="#DDDDDD", command=popup.destroy)
B1.pack()
def cal():
root = Tk()
root.title("Calc")
root.resizable(0, 0)
entry_font = font.Font(size=15)
entry = Entry(root, justify="right", font=entry_font)
entry.grid(row=0, column=0, columnspan=4,
sticky=N + W + S + E, padx=5, pady=5)
cal_button_bg = '#FF6600'
num_button_bg = '#4B4B4B'
other_button_bg = '#DDDDDD'
text_fg = '#FFFFFF'
button_active_bg = '#C0C0C0'
num_button = partial(Button, root, fg=text_fg, bg=num_button_bg,
padx=10, pady=3, activebackground=button_active_bg)
cal_button = partial(Button, root, fg=text_fg, bg=cal_button_bg,
padx=10, pady=3, activebackground=button_active_bg)
button7 = num_button(text='7', bg=num_button_bg,
command=lambda: get_input(entry, '7'))
button7.grid(row=2, column=0, pady=5)
button8 = num_button(text='8', command=lambda: get_input(entry, '8'))
button8.grid(row=2, column=1, pady=5)
button9 = num_button(text='9', command=lambda: get_input(entry, '9'))
button9.grid(row=2, column=2, pady=5)
button10 = cal_button(text='+', command=lambda: get_input(entry, '+'))
button10.grid(row=4, column=3, pady=5)
button4 = num_button(text='4', command=lambda: get_input(entry, '4'))
button4.grid(row=3, column=0, pady=5)
button5 = num_button(text='5', command=lambda: get_input(entry, '5'))
button5.grid(row=3, column=1, pady=5)
button6 = num_button(text='6', command=lambda: get_input(entry, '6'))
button6.grid(row=3, column=2, pady=5)
button11 = cal_button(text='-', command=lambda: get_input(entry, '-'))
button11.grid(row=3, column=3, pady=5)
button1 = num_button(text='1', command=lambda: get_input(entry, '1'))
button1.grid(row=4, column=0, pady=5)
button2 = num_button(text='2', command=lambda: get_input(entry, '2'))
button2.grid(row=4, column=1, pady=5)
button3 = num_button(text='3', command=lambda: get_input(entry, '3'))
button3.grid(row=4, column=2, pady=5)
button12 = cal_button(text='*', command=lambda: get_input(entry, '*'))
button12.grid(row=2, column=3, pady=5)
button0 = num_button(text='0', command=lambda: get_input(entry, '0'))
#button0.grid(row=5, column=0, columnspan=2, padx=3, pady=5, sticky=N + S + E + W)
button0.grid(row=5, column=0, pady=5)
button13 = num_button(text='.', command=lambda: get_input(entry, '.'))
button13.grid(row=5, column=1, pady=5)
button14 = Button(root, text='/', fg=text_fg, bg=cal_button_bg, padx=10, pady=3,
command=lambda: get_input(entry, '/'))
button14.grid(row=1, column=3, pady=5)
button15 = Button(root, text='<-', bg=other_button_bg, padx=10, pady=3,
command=lambda: backspace(entry), activebackground=button_active_bg)
button15.grid(row=1, column=0, columnspan=2,
padx=3, pady=5, sticky=N + S + E + W)
button16 = Button(root, text='C', bg=other_button_bg, padx=10, pady=3,
command=lambda: clear(entry), activebackground=button_active_bg)
button16.grid(row=1, column=2, pady=5)
button17 = Button(root, text='=', fg=text_fg, bg=cal_button_bg, padx=10, pady=3,
command=lambda: calc(entry), activebackground=button_active_bg)
button17.grid(row=5, column=3, pady=5)
button18 = Button(root, text='^', fg=text_fg, bg=cal_button_bg, padx=10, pady=3,
command=lambda: get_input(entry, '**'))
button18.grid(row=5, column=2, pady=5)
def quit():
exit['command'] = root.quit()
exit = Button(root, text='Quit', fg='white', bg='black', command=quit, height=1, width=7)
exit.grid(row=6, column=1)
root.mainloop()
if __name__ == '__main__':
cal()
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(11-20)
50个开发必备的Python经典脚本(21-30)
50个开发必备的Python经典脚本(31-40)
50个开发必备的Python经典脚本(41-50)