目录
41. 彩色图像到黑白图像转换器
所需的库
用法
例子
42. CricBuzz 分数更新
如何跑
43.CSV 到 Excel
要求
44. 当前城市天气
45. 目录管理器
46. Excel 文件合并
所需的库
用法
47. 扩展IP地址信息
运行程序
输出
48.列表转换器的Excel到Python列表
所需的库
用法
49. Python 中的文件资源管理器对话框
1.使用tkinter
2.使用PyQt
50. 文件共享机器人
建议收藏备用
一个简单的 Python 脚本,它将彩色图像文件名作为参数,将其转换为灰度图像并保存输出图像文件。它展示了 Pillow 库的基本用法。
$pip install Pillow
$python bw_convert.py
$python bw_convert.py sample_image.jpg
$python bw_convert.py sample_image.png
import sys
from PIL import Image
from PIL.ExifTags import TAGS
image_file = sys.argv[1]
image_name = image_file.split(".")[0]
try:
image = Image.open(image_file)
except IOError:
print("Error in loading image!!")
sys.exit(1)
bw_image = image.convert('L')
bw_image.save("bw_"+image_name+".png")
这个基于网络抓取的 Python 脚本使用 Beautiful soup 库抓取数据来获取最近的板球比赛得分。
在终端中输入此命令。
python3 cricbuzz_scrap.py
它将显示最近所有比赛的比分更新。
from urllib.request import urlopen
from bs4 import BeautifulSoup
quote_page = 'http://www.cricbuzz.com/cricket-match/live-scores'
page = urlopen(quote_page)
soup = BeautifulSoup(page,'html.parser')
update=[]
for score in soup.find_all('div',attrs={'class':'cb-col cb-col-100 cb-lv-main'}):
s=score.text.strip()
update.append(s)
print('-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*')
for i in range(len(update)):
print(i+1),
print(update[i])
print('-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*')
该程序将任何逗号分隔值文件(例如:.csv 或 .data)中的数据写入 Excel 文件。
安装所需的库:
$ pip install openpyxl
之后运行:
$ python main.py
输入文件示例
#!python3
# -*- coding: utf-8 -*-
import openpyxl
import sys
#inputs
print("This programme writes the data in any Comma-separated value file (such as: .csv or .data) to a Excel file.")
print("The input and output files must be in the same directory of the python file for the programme to work.\n")
csv_name = input("Name of the CSV file for input (with the extension): ")
sep = input("Seperator of the CSV file: ")
excel_name = input("Name of the excel file for output (with the extension): ")
sheet_name = input("Name of the excel sheet for output: ")
#opening the files
try:
wb = openpyxl.load_workbook(excel_name)
sheet = wb.get_sheet_by_name(sheet_name)
file = open(csv_name,"r",encoding = "utf-8")
except:
print("File Error!")
sys.exit()
#rows and columns
row = 1
column = 1
#for each line in the file
for line in file:
#remove the \n from the line and make it a list with the seperator
line = line[:-1]
line = line.split(sep)
#for each data in the line
for data in line:
#write the data to the cell
sheet.cell(row,column).value = data
#after each data column number increases by 1
column += 1
#to write the next line column number is set to 1 and row number is increased by 1
column = 1
row += 1
#saving the excel file and closing the csv file
wb.save(excel_name)
file.close()
使用 GET 请求检索您所在城市当前天气的详细信息,只需插入任何城市的名称,它将提供当前温度、当前风速和当前天气类型等详细信息。
import requests
def get_temperature(json_data):
temp_in_celcius = json_data['main']['temp']
return temp_in_celcius
def get_weather_type(json_data):
weather_type = json_data['weather'][0]['description']
return weather_type
def get_wind_speed(json_data):
wind_speed = json_data['wind']['speed']
return wind_speed
def get_weather_data(json_data, city):
description_of_weather = json_data['weather'][0]['description']
weather_type = get_weather_type(json_data)
temperature = get_temperature(json_data)
wind_speed = get_wind_speed(json_data)
weather_details = ''
return weather_details + ("The weather in {} is currently {} with a temperature of {} degrees and wind speeds reaching {} km/ph".format(city, weather_type, temperature, wind_speed))
def main():
api_address = 'https://api.openweathermap.org/data/2.5/weather?q=Sydney,au&appid=a10fd8a212e47edf8d946f26fb4cdef8&q='
city = input("City Name : ")
units_format = "&units=metric"
final_url = api_address + city + units_format
json_data = requests.get(final_url).json()
weather_details = get_weather_data(json_data, city)
# print formatted data
print(weather_details)
main()
根据类型(常见扩展名)组织给定目录中的文件。无法识别的扩展名保留在父目录本身中,而其他扩展名则移动到相应的新目录,例如“图片”等。
python main.py [-h] 目录路径
#!/usr/bin/python3
import argparse
import os
def path():
parse = argparse.ArgumentParser(
add_help=True, description="Organize your files to different directories according to their type")
parse.add_argument('directory_path', type=str, default='./',
help="The absolute path to the directory")
return parse.parse_args().directory_path
documents = ['.log', '.txt', '.doc', '.docx', '.md', '.pdf', '.wps']
picture = ['.png', '.jpg', 'jpeg', '.bmp']
music = ['.mp3', '.wav']
compressed = ['.zip', '.rar', '.tar', '.gz', '.bz2', '.xz']
video = ['.3gp', '.mov', '.mp4', '.mkv', '.srt', '.avi']
web = ['.html', .'.css', '.js']
source = ['.py', '.c', '.cpp', '.java',]
directories = [path() + '/Compressed', path() + '/Documents',
path() + '/Pictures', path() + '/Music', path() + '/Video', path() + '/Web', path() + '/Source-codes',]
print("This will organize your files to different directories according to their type!!")
print("Are you sure you want to continue? (y/n)")
flag = input('>>>')
if flag.lower() == 'y':
try:
for d in directories:
os.mkdir(d)
except FileExistsError:
pass
for files in os.listdir(path()):
dot = (files.rfind('.'))
if dot is not 0 and dot is not -1:
if files[dot:].lower() in music:
os.rename(path() + '/' + files, path() + '/Music/' + files)
if files[dot:].lower() in picture:
os.rename(path() + '/' + files, path() + '/Pictures/' + files)
if files[dot:].lower() in documents:
os.rename(path() + '/' + files, path() + '/Documents/' + files)
if files[dot:].lower() in compressed:
os.rename(path() + '/' + files, path() +
'/Compressed/' + files)
if files[dot:].lower() in video:
os.rename(path() + '/' + files, path() + '/Video/' + files)
if files[dot:].lower() in web:
os.rename(path() + '/' + files, path() + '/Web/' + files)
if files[dot:].lower() in source:
os.rename(path() + '/' + files, path() + '/Source-codes/' + files)
for d in directories:
if os.listdir(d) is None:
os.removedirs(d)
else:
print("Exiting")
os.sys.exit(0)
一个简单的脚本,将给定路径中具有类似表结构的 Excel 文件作为输入,并创建统一的 Excel 工作簿。
$pip install openpyxl
提供了示例脚本“将 excel 文件合并到 1.py”来展示 Excel 合并的用法。运行脚本时,它将询问统一工作簿的名称以及包含需要合并的 Excel 文件的文件夹的路径。
from openpyxl import load_workbook
from openpyxl import Workbook
import os
# Read data from active worksheet and return it as a list
def reader(file):
global path
abs_file = os.path.join(path, file)
wb_sheet = load_workbook(abs_file).active
rows = []
# min_row is set to 2, ignore the first row which contains headers
for row in wb_sheet.iter_rows(min_row=2):
row_data = []
for cell in row:
row_data.append(cell.value)
rows.append(row_data)
return rows
# You can replace these with your own headers for the table
headers = ['Nume', 'Prenume', 'Titlu', 'Editura', 'Cota', 'Pret', 'An']
# Unified excel name
workbook_name = input('Unified Workbook name ')
book = Workbook()
sheet = book.active
# Specify path
path = input('Path: ')
# Get all files from folder
files = os.listdir(path)
for file in files:
rows = reader(file)
for row in rows:
sheet.append(row)
book.save(filename=workbook_name)
从终端查看有关您的公共 IP 地址的扩展信息。
python 脚本 curl
使用以下参数运行
curl -H "Accept: application/json" [https://ipinfo.io/json](https://ipinfo.io/json)
python extended_ip_address_info.py
输出应采用以下形式:
{
"ip": "xxx.xxx.xxx.xxx",
"city": "A_city",
"hostname": "host.isp-website.com",
"region": "A_region",
"country": "Country code",
"loc": "coordinates",
"org": "AS-number ISP-name",
"postal": "postal-code",
"timezone": "Europe/City",
"readme": "https://ipinfo.io/missingauth"
}
#!/bin/python
# -*- coding: utf-8 -*-
# Using curl to get data from https://ipinfo.io/json
# Template from pycurl documentation
# http://pycurl.io/docs/latest/quickstart.html#examining-response-headers
import pycurl #curl library
import certifi #HTTP over TLS/SSL library
from io import BytesIO #Buffered I/O implementation using an in-memory bytes buffer.
#set header, '--header' or -H
header = ['Accept: application/json']
buffer = BytesIO()
c = pycurl.Curl() #curl
c.setopt(c.HTTPHEADER, header) #header
c.setopt(c.URL, 'https://ipinfo.io/json') #URL
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where()) # SSL certificates
c.perform()
c.close()
body = buffer.getvalue()
# Body is a byte string.
# We have to know the encoding in order to print it to a text file
# such as standard output.
print(body.decode('iso-8859-1'))
一个简单的工具,可以读取 Excel 文件和任何相应的工作表,并将其转换为列表数据结构的 Python 列表。
$pip install xlrd
已提供示例脚本 excel_to_list_usage.py
来展示 ExcelToList 的用法。它读取 Excel 及其工作表,并打印列表列表。
import xlrd
import sys
class ExcelToList():
def __init__(self, file, sheet):
self.file = file
self.sheet = sheet
def convert(self):
converted_list = []
inputexcel = xlrd.open_workbook(self.file)
inputsheet = inputexcel.sheet_by_name(self.sheet)
numberofrows = inputsheet.nrows
numberofcols = inputsheet.ncols
start_row,start_col = 0,0
for current_row in range(start_row,numberofrows):
currentlist = []
for current_col in range(start_col,numberofcols):
currentlist.append(inputsheet.cell(current_row,current_col).value)
converted_list.append(currentlist)
return converted_list
点击这里了解更多详情
打开文件资源管理器对话框 UI 以使用 Python 选择文件。
使用 tkinter 的示例:
$ python select_file_tk.py
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
print(file_path)
安装 PyQt5
使用 PyQt5 的示例:
$ python select_file_pyqt.py
from PyQt5.QtWidgets import QFileDialog, QApplication
from PyQt5 import QtWidgets
def select_files(directory_location=None):
qtapp = QApplication([directory_location])
qtwgt = QtWidgets.QWidget()
filenames, _ = QFileDialog.getOpenFileNames(qtwgt)
return filenames
def main():
filenames = select_files()
print("You selected:\n", "\n".join(filename for filename in filenames))
if __name__ == "__main__":
main()
用Python开发的文件共享电报机器人它就像一个集中的文件存储库,授权用户可以在其中共享文件,并且文件对所有用户都可用。使用/help命令可以查看功能和命令。该机器人可以直接托管在 Heroku 上。
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
import logging
import os
import telegram
import shutil
# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
#list of authorized users
#create a list of telegram usernames to authorise them, 0th username is admin.
username_list = []
# Define a few command handlers. These usually take the two arguments bot and
# update. Error handlers also receive the raised TelegramError object in error.
def start(bot, update):
"""Send a message when the command /start is issued."""
reply = "Welcome to World of Automation. \nI am a bot developed by a Lazy Programmer.\nSend /help command to see what i can do."
update.message.reply_text(reply)
def help(bot, update):
"""Send a message when the command /help is issued."""
admin = update.message.from_user.username
if admin == username_list[0]:
reply = '''Send /get folder_name/file_name.extension to receive a file.
\nSend /ls folder_name to show list of files.
\nSend /put folder_name/file_name.extension to upload last sent file.
\nSend /mkdir folder_name to create a Folder.
\nSend /remove folder_name/filename.extension to delete a file.
\nSend /adduser username to give access.
\nSend /removeuser username to revoke access.
\nSend /showuser to show list of users
'''
else:
reply = '''Send /get folder_name/file_name.extension to receive a file.
\nSend /ls folder_name to show list of files.
\nSend /put folder_name/file_name.extension to upload last sent file.
\nSend /mkdir folder_name to create a Folder.
'''
update.message.reply_text(reply)
def get(bot, update):
"""Send requested file."""
username = update.message.from_user.username
if(username not in username_list):
update.message.reply_text("You are not Authorized.")
return
file = update.message.text.split(" ")[-1]
if(file == "/send"):
update.message.reply_text("Invalid File name.")
else:
reply = "Findind and Sending a requested file to you. Hold on..."
update.message.reply_text(reply)
path = os.getcwd()+'/'+file
if (os.path.exists(path)):
bot.send_document(chat_id=update.message.chat_id,document=open(path, 'rb'), timeout = 100)
else:
update.message.reply_text("File not Found.")
def ls(bot, update):
"""Show files in requested directory."""
username = update.message.from_user.username
if(username not in username_list):
update.message.reply_text("You are not Authorized.")
return
file = update.message.text.split(" ")[-1]
if(file == "/show"):
update.message.reply_text("Invalid Directory name.")
else:
reply = "Findind and Sending a list of files to you. Hold on..."
update.message.reply_text(reply)
path = os.getcwd()+'/'+file
if (os.path.exists(path)):
update.message.reply_text(os.listdir(path))
else:
update.message.reply_text("Directory not Found.")
def put(bot, update):
f = open(str(os.getcwd())+"/file", "r")
file_id = f.read()
f.close
if file_id == "":
update.message.reply_text("You didn't upload file.")
else:
new_file = bot.get_file(file_id)
message = update.message.text.split(" ")
path = message[-1]
if len(path) < 1:
update.message.reply_text("Enter Path correctly.")
else:
new_file.download(os.getcwd()+'/'+path)
update.message.reply_text("File Stored.")
def mkdir(bot, update):
message = update.message.text.split(" ")
if len(message) < 1 or message[-1] == "/mkdir":
update.message.reply_text("Invalid Syntax. Refer syntax in help section.")
return
path = os.getcwd() + "/" + message[-1]
os.mkdir(path)
update.message.reply_text("Folder Created.")
def echo(bot, update):
"""Echo the user message."""
if update.message.document:
file_id = update.message.document.file_id
f = open(str(os.getcwd())+"/file", "w")
f.write(file_id)
f.close
update.message.reply_text("Received.Now send file name and location to store. using /put command")
else:
reply = "Invalid Input."
update.message.reply_text(reply)
def error(bot, update, error):
"""Log Errors caused by Updates."""
logger.warning('Update "%s" caused error "%s"', update, error)
def add_user(bot, update):
admin = update.message.from_user.username
if admin == username_list[0]:
username = update.message.text.split(" ")[-1]
username_list.append(username)
update.message.reply_text("User added.")
else:
update.message.reply_text("You are not Authorized.")
def show_user(bot, update):
admin = update.message.from_user.username
if admin == username_list[0]:
update.message.reply_text(username_list)
else:
update.message.reply_text("You are not Authorized.")
def remove_user(bot, update):
admin = update.message.from_user.username
if admin == username_list[0]:
username = update.message.text.split(" ")[-1]
username_list.remove(username)
update.message.reply_text("User Removed.")
else:
update.message.reply_text("You are not Authorized.")
def remove(bot, update):
admin = update.message.from_user.username
if admin == username_list[0]:
filename = update.message.text.split(" ")[-1]
os.remove(os.getcwd()+ "/" + filename)
update.message.reply_text("File Removed.")
else:
update.message.reply_text("You are not Authorized.")
def rmdir(bot, update):
admin = update.message.from_user.username
if admin == username_list[0]:
filename = update.message.text.split(" ")[-1]
shutil.rmtree(os.getcwd()+ "/" + filename)
update.message.reply_text("Folder Removed.")
else:
update.message.reply_text("You are not Authorized.")
def main():
"""Start the bot."""
# Create the EventHandler and pass it your bot's token.
TOKEN = os.environ['TOKEN']
updater = Updater(TOKEN)
# Get the dispatcher to register handlers
dp = updater.dispatcher
# on different commands - answer in Telegram
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("help", help))
dp.add_handler(CommandHandler("get", get))
dp.add_handler(CommandHandler("ls", ls))
dp.add_handler(CommandHandler("put", put))
dp.add_handler(CommandHandler("mkdir", mkdir))
#admin functionalities
dp.add_handler(CommandHandler("adduser", add_user))
dp.add_handler(CommandHandler("showuser", show_user))
dp.add_handler(CommandHandler("removeUser", remove_user))
dp.add_handler(CommandHandler("remove", remove))
dp.add_handler(CommandHandler("rmdir", rmdir))
# on noncommand i.e message - echo the message on Telegram
dp.add_handler(MessageHandler(Filters.document, echo))
# log all errors
dp.add_error_handler(error)
# Start the Bot
updater.start_polling()
# Run the bot until you press Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT. This should be used most of the time, since
# start_polling() is non-blocking and will stop the bot gracefully.
updater.idle()
if __name__ == '__main__':
main()