Python从入门到精通:10个实战脚本带你飞跃成长

​十个常见的 Python 脚本 (详细介绍 + 代码举例) 介绍: 该脚本用于批量重命名指定目录下的文件,例如将所有 ".txt" 文件重命名为 ".md" 文件。介绍: 该脚本用于爬取网页数据,例如新闻标题、商品价格等,并可以将数据保存到本地或数据库。介绍: 该脚本用于数据可视化,例如绘制图表、生成报表等,可以更直观地展示数据。介绍: 该脚本用于读取 CSV 文件,并可以根据需要对数据进行处理和分析。介绍: 该脚本用于发送邮件通知,例如在脚本执行完毕后发送邮件通知管理员。介绍: 该脚本用于将数据写入 CSV 文件,可以用于数据存储和导出。 阅读详情

包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取!】

作为优快云技术博主,我将为你设计10个Python脚本,从基础到高级,逐步提升你的Python编程能力。每个脚本都配有详细解释和应用场景分析。

脚本1:Python基础 - 温度转换器

# 摄氏度和华氏度互相转换
def temperature_converter():
    print("温度转换器")
    print("1. 摄氏度转华氏度")
    print("2. 华氏度转摄氏度")
    choice = input("请选择转换类型(1/2): ")
    
    if choice == '1':
        celsius = float(input("请输入摄氏度: "))
        fahrenheit = (celsius * 9/5) + 32
        print(f"{celsius}°C = {fahrenheit:.2f}°F")
    elif choice == '2':
        fahrenheit = float(input("请输入华氏度: "))
        celsius = (fahrenheit - 32) * 5/9
        print(f"{fahrenheit}°F = {celsius:.2f}°C")
    else:
        print("无效输入")

if __name__ == "__main__":
    temperature_converter()

学习要点:基础输入输出、条件判断、浮点数运算、字符串格式化

脚本2:数据结构 - 简易通讯录

# 使用字典实现简易通讯录
def contact_book():
    contacts = {}
    
    while True:
        print("\n简易通讯录")
        print("1. 添加联系人")
        print("2. 查找联系人")
        print("3. 删除联系人")
        print("4. 显示所有联系人")
        print("5. 退出")
        
        choice = input("请选择操作(1-5): ")
        
        if choice == '1':
            name = input("输入姓名: ")
            phone = input("输入电话: ")
            contacts[name] = phone
            print(f"{name} 已添加到通讯录")
        elif choice == '2':
            name = input("输入要查找的姓名: ")
            print(f"{name}: {contacts.get(name, '未找到')}")
        elif choice == '3':
            name = input("输入要删除的姓名: ")
            if name in contacts:
                del contacts[name]
                print(f"{name} 已删除")
            else:
                print("联系人不存在")
        elif choice == '4':
            print("\n所有联系人:")
            for name, phone in contacts.items():
                print(f"{name}: {phone}")
        elif choice == '5':
            print("退出通讯录")
            break
        else:
            print("无效输入")

if __name__ == "__main__":
    contact_book()

学习要点:字典操作、循环控制、用户交互设计

脚本3:文件操作 - 日志分析器

# 分析日志文件,统计错误和警告数量
import re

def log_analyzer():
    log_file = input("请输入日志文件路径: ")
    error_count = 0
    warning_count = 0
    
    try:
        with open(log_file, 'r') as file:
            for line in file:
                if re.search(r'ERROR', line, re.IGNORECASE):
                    error_count += 1
                elif re.search(r'WARNING', line, re.IGNORECASE):
                    warning_count += 1
        
        print(f"分析结果:")
        print(f"错误(ERROR)数量: {error_count}")
        print(f"警告(WARNING)数量: {warning_count}")
        print(f"总计: {error_count + warning_count}")
        
    except FileNotFoundError:
        print("文件未找到,请检查路径")
    except Exception as e:
        print(f"发生错误: {str(e)}")

if __name__ == "__main__":
    log_analyzer()

学习要点:文件操作、正则表达式、异常处理

脚本4:面向对象 - 银行账户系统

# 简单的银行账户类实现
class BankAccount:
    def __init__(self, account_holder, initial_balance=0):
        self.account_holder = account_holder
        self.balance = initial_balance
        self.transactions = []
    
    def deposit(self, amount):
        if amount > 0:
            self.balance += amount
            self.transactions.append(f"存款: +{amount}")
            return True
        return False
    
    def withdraw(self, amount):
        if 0 < amount <= self.balance:
            self.balance -= amount
            self.transactions.append(f"取款: -{amount}")
            return True
        return False
    
    def get_balance(self):
        return self.balance
    
    def get_transactions(self):
        return self.transactions
    
    def __str__(self):
        return f"账户持有人: {self.account_holder}, 余额: {self.balance}"

def bank_system():
    accounts = {}
    
    while True:
        print("\n简易银行系统")
        print("1. 创建账户")
        print("2. 存款")
        print("3. 取款")
        print("4. 查询余额")
        print("5. 查询交易记录")
        print("6. 退出")
        
        choice = input("请选择操作(1-6): ")
        
        if choice == '1':
            name = input("输入账户持有人姓名: ")
            initial = float(input("输入初始金额: "))
            accounts[name] = BankAccount(name, initial)
            print(f"账户创建成功: {accounts[name]}")
        elif choice == '2':
            name = input("输入账户持有人姓名: ")
            if name in accounts:
                amount = float(input("输入存款金额: "))
                if accounts[name].deposit(amount):
                    print("存款成功")
                else:
                    print("存款金额必须大于0")
            else:
                print("账户不存在")
        elif choice == '3':
            name = input("输入账户持有人姓名: ")
            if name in accounts:
                amount = float(input("输入取款金额: "))
                if accounts[name].withdraw(amount):
                    print("取款成功")
                else:
                    print("取款金额无效或余额不足")
            else:
                print("账户不存在")
        elif choice == '4':
            name = input("输入账户持有人姓名: ")
            if name in accounts:
                print(f"当前余额: {accounts[name].get_balance()}")
            else:
                print("账户不存在")
        elif choice == '5':
            name = input("输入账户持有人姓名: ")
            if name in accounts:
                print("交易记录:")
                for trans in accounts[name].get_transactions():
                    print(trans)
            else:
                print("账户不存在")
        elif choice == '6':
            print("退出银行系统")
            break
        else:
            print("无效输入")

if __name__ == "__main__":
    bank_system()

学习要点:类与对象、封装、方法设计、对象管理

脚本5:网络请求 - 天气查询工具

# 使用API查询天气信息
import requests
import json

def weather_app():
    API_KEY = "YOUR_API_KEY"  # 替换为你的API密钥
    BASE_URL = "http://api.openweathermap.org/data/2.5/weather"
    
    city = input("输入城市名称: ")
    
    try:
        params = {
            'q': city,
            'appid': API_KEY,
            'units': 'metric',
            'lang': 'zh_cn'
        }
        
        response = requests.get(BASE_URL, params=params)
        data = response.json()
        
        if response.status_code == 200:
            print(f"\n{city}的天气信息:")
            print(f"温度: {data['main']['temp']}°C")
            print(f"天气状况: {data['weather'][0]['description']}")
            print(f"湿度: {data['main']['humidity']}%")
            print(f"风速: {data['wind']['speed']} m/s")
        else:
            print(f"获取天气信息失败: {data.get('message', '未知错误')}")
    
    except requests.exceptions.RequestException as e:
        print(f"网络请求错误: {str(e)}")
    except json.JSONDecodeError:
        print("解析响应数据失败")
    except KeyError:
        print("获取天气数据时发生错误")

if __name__ == "__main__":
    weather_app()

学习要点:API调用、HTTP请求、JSON数据处理、异常处理

脚本6:多线程 - 网页下载器

# 多线程下载多个网页内容
import threading
import requests
import time

def download_page(url, results, index):
    try:
        response = requests.get(url, timeout=10)
        results[index] = {
            'url': url,
            'status': response.status_code,
            'length': len(response.text),
            'time': time.time()
        }
    except Exception as e:
        results[index] = {
            'url': url,
            'error': str(e)
        }

def multi_downloader():
    urls = [
        'https://www.python.org',
        'https://www.google.com',
        'https://www.github.com',
        'https://www.example.com',
        'https://www.baidu.com'
    ]
    
    results = [None] * len(urls)
    threads = []
    
    start_time = time.time()
    
    for i, url in enumerate(urls):
        thread = threading.Thread(
            target=download_page,
            args=(url, results, i)
        )
        threads.append(thread)
        thread.start()
    
    for thread in threads:
        thread.join()
    
    print("\n下载结果:")
    for result in results:
        if 'error' in result:
            print(f"{result['url']} - 错误: {result['error']}")
        else:
            print(f"{result['url']} - 状态: {result['status']}, "
                  f"大小: {result['length']}字节, "
                  f"耗时: {time.time() - start_time:.2f}秒")

if __name__ == "__main__":
    multi_downloader()

学习要点:多线程编程、线程同步、性能优化

脚本7:数据处理 - CSV分析工具

# 分析CSV文件数据
import csv
from collections import defaultdict

def csv_analyzer():
    file_path = input("请输入CSV文件路径: ")
    
    try:
        with open(file_path, mode='r', encoding='utf-8') as file:
            reader = csv.DictReader(file)
            
            if not reader.fieldnames:
                print("CSV文件为空或格式不正确")
                return
            
            print(f"\n可用字段: {', '.join(reader.fieldnames)}")
            numeric_fields = []
            
            # 检测数值型字段
            first_row = next(reader, None)
            if first_row:
                for field in reader.fieldnames:
                    try:
                        float(first_row[field])
                        numeric_fields.append(field)
                    except (ValueError, TypeError):
                        pass
            
            print(f"\n数值型字段: {', '.join(numeric_fields) if numeric_fields else '无'}")
            
            # 重置文件指针
            file.seek(0)
            next(reader)  # 跳过标题行
            
            # 统计数据
            stats = defaultdict(list)
            row_count = 0
            
            for row in reader:
                row_count += 1
                for field in numeric_fields:
                    try:
                        value = float(row[field])
                        stats[field].append(value)
                    except (ValueError, TypeError):
                        pass
            
            print(f"\n分析结果 (共 {row_count} 行数据):")
            for field in numeric_fields:
                values = stats[field]
                if values:
                    print(f"\n字段: {field}")
                    print(f"  平均值: {sum(values)/len(values):.2f}")
                    print(f"  最大值: {max(values):.2f}")
                    print(f"  最小值: {min(values):.2f}")
                    print(f"  中位数: {sorted(values)[len(values)//2]:.2f}")
                else:
                    print(f"\n字段: {field} - 无有效数据")
    
    except FileNotFoundError:
        print("文件未找到,请检查路径")
    except Exception as e:
        print(f"分析CSV文件时出错: {str(e)}")

if __name__ == "__main__":
    csv_analyzer()

学习要点:CSV处理、数据分析、统计计算、异常处理

脚本8:GUI编程 - 简易画图板

# 使用tkinter创建简易画图程序
import tkinter as tk
from tkinter import colorchooser

class DrawingApp:
    def __init__(self, root):
        self.root = root
        self.root.title("简易画图板")
        
        self.canvas = tk.Canvas(root, bg="white", width=800, height=600)
        self.canvas.pack(fill=tk.BOTH, expand=True)
        
        self.setup_toolbar()
        self.setup_bindings()
        
        self.last_x = None
        self.last_y = None
        self.color = "black"
        self.line_width = 2
        self.drawing_tool = "pen"
    
    def setup_toolbar(self):
        toolbar = tk.Frame(self.root)
        toolbar.pack(fill=tk.X)
        
        # 工具按钮
        tk.Button(toolbar, text="画笔", command=lambda: self.set_tool("pen")).pack(side=tk.LEFT)
        tk.Button(toolbar, text="直线", command=lambda: self.set_tool("line")).pack(side=tk.LEFT)
        tk.Button(toolbar, text="矩形", command=lambda: self.set_tool("rect")).pack(side=tk.LEFT)
        tk.Button(toolbar, text="椭圆", command=lambda: self.set_tool("oval")).pack(side=tk.LEFT)
        tk.Button(toolbar, text="橡皮", command=lambda: self.set_tool("eraser")).pack(side=tk.LEFT)
        tk.Button(toolbar, text="清空", command=self.clear_canvas).pack(side=tk.LEFT)
        
        # 颜色选择
        tk.Button(toolbar, text="颜色", command=self.choose_color).pack(side=tk.LEFT)
        self.color_display = tk.Label(toolbar, bg=self.color, width=2, relief=tk.SUNKEN)
        self.color_display.pack(side=tk.LEFT, padx=5)
        
        # 线宽选择
        tk.Label(toolbar, text="线宽:").pack(side=tk.LEFT)
        self.width_slider = tk.Scale(toolbar, from_=1, to=20, orient=tk.HORIZONTAL, 
                                    command=self.set_width)
        self.width_slider.set(self.line_width)
        self.width_slider.pack(side=tk.LEFT)
    
    def setup_bindings(self):
        self.canvas.bind("<Button-1>", self.start_draw)
        self.canvas.bind("<B1-Motion>", self.draw)
        self.canvas.bind("<ButtonRelease-1>", self.end_draw)
    
    def set_tool(self, tool):
        self.drawing_tool = tool
    
    def choose_color(self):
        color = colorchooser.askcolor()[1]
        if color:
            self.color = color
            self.color_display.config(bg=color)
    
    def set_width(self, value):
        self.line_width = int(value)
    
    def clear_canvas(self):
        self.canvas.delete("all")
    
    def start_draw(self, event):
        self.last_x = event.x
        self.last_y = event.y
        
        if self.drawing_tool in ["line", "rect", "oval"]:
            self.start_x = event.x
            self.start_y = event.y
            self.temp_item = None
    
    def draw(self, event):
        x, y = event.x, event.y
        
        if self.drawing_tool == "pen":
            if self.last_x and self.last_y:
                self.canvas.create_line(self.last_x, self.last_y, x, y, 
                                      fill=self.color, width=self.line_width)
            self.last_x = x
            self.last_y = y
        
        elif self.drawing_tool == "eraser":
            if self.last_x and self.last_y:
                self.canvas.create_line(self.last_x, self.last_y, x, y, 
                                      fill="white", width=self.line_width*2)
            self.last_x = x
            self.last_y = y
        
        elif self.drawing_tool in ["line", "rect", "oval"]:
            if self.temp_item:
                self.canvas.delete(self.temp_item)
            
            if self.drawing_tool == "line":
                self.temp_item = self.canvas.create_line(
                    self.start_x, self.start_y, x, y,
                    fill=self.color, width=self.line_width)
            elif self.drawing_tool == "rect":
                self.temp_item = self.canvas.create_rectangle(
                    self.start_x, self.start_y, x, y,
                    outline=self.color, width=self.line_width)
            elif self.drawing_tool == "oval":
                self.temp_item = self.canvas.create_oval(
                    self.start_x, self.start_y, x, y,
                    outline=self.color, width=self.line_width)
    
    def end_draw(self, event):
        if self.drawing_tool in ["line", "rect", "oval"] and hasattr(self, 'temp_item'):
            if self.temp_item:
                self.canvas.itemconfig(self.temp_item, tags=("permanent",))
            del self.temp_item
        
        self.last_x = None
        self.last_y = None

if __name__ == "__main__":
    root = tk.Tk()
    app = DrawingApp(root)
    root.mainloop()

学习要点:GUI编程、事件处理、绘图功能、面向对象设计

脚本9:数据库 - 学生管理系统

# 使用SQLite数据库的学生管理系统
import sqlite3
from contextlib import closing

class StudentManager:
    def __init__(self, db_name="students.db"):
        self.db_name = db_name
        self.init_db()
    
    def init_db(self):
        with closing(sqlite3.connect(self.db_name)) as conn:
            with conn:
                conn.execute("""
                CREATE TABLE IF NOT EXISTS students (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    name TEXT NOT NULL,
                    age INTEGER,
                    gender TEXT,
                    major TEXT,
                    grade REAL
                )
                """)
    
    def add_student(self, name, age, gender, major, grade):
        with closing(sqlite3.connect(self.db_name)) as conn:
            with conn:
                conn.execute("""
                INSERT INTO students (name, age, gender, major, grade)
                VALUES (?, ?, ?, ?, ?)
                """, (name, age, gender, major, grade))
    
    def delete_student(self, student_id):
        with closing(sqlite3.connect(self.db_name)) as conn:
            with conn:
                conn.execute("DELETE FROM students WHERE id = ?", (student_id,))
    
    def update_student(self, student_id, **kwargs):
        if not kwargs:
            return False
        
        set_clause = ", ".join(f"{k} = ?" for k in kwargs.keys())
        values = list(kwargs.values())
        values.append(student_id)
        
        with closing(sqlite3.connect(self.db_name)) as conn:
            with conn:
                conn.execute(f"""
                UPDATE students 
                SET {set_clause}
                WHERE id = ?
                """, values)
        
        return True
    
    def get_student(self, student_id):
        with closing(sqlite3.connect(self.db_name)) as conn:
            cursor = conn.execute("SELECT * FROM students WHERE id = ?", (student_id,))
            return cursor.fetchone()
    
    def list_students(self, filter_by=None, filter_value=None):
        query = "SELECT * FROM students"
        params = ()
        
        if filter_by and filter_value:
            query += f" WHERE {filter_by} = ?"
            params = (filter_value,)
        
        with closing(sqlite3.connect(self.db_name)) as conn:
            cursor = conn.execute(query, params)
            return cursor.fetchall()
    
    def get_statistics(self):
        with closing(sqlite3.connect(self.db_name)) as conn:
            cursor = conn.execute("""
            SELECT 
                COUNT(*) as total,
                AVG(grade) as avg_grade,
                MAX(grade) as max_grade,
                MIN(grade) as min_grade
            FROM students
            """)
            return cursor.fetchone()

def student_system():
    manager = StudentManager()
    
    while True:
        print("\n学生管理系统")
        print("1. 添加学生")
        print("2. 删除学生")
        print("3. 更新学生信息")
        print("4. 查询学生")
        print("5. 列出所有学生")
        print("6. 按条件筛选学生")
        print("7. 查看统计信息")
        print("8. 退出")
        
        choice = input("请选择操作(1-8): ")
        
        if choice == '1':
            name = input("姓名: ")
            age = int(input("年龄: "))
            gender = input("性别(M/F): ").upper()
            major = input("专业: ")
            grade = float(input("成绩: "))
            manager.add_student(name, age, gender, major, grade)
            print("学生添加成功")
        
        elif choice == '2':
            student_id = int(input("输入要删除的学生ID: "))
            if manager.get_student(student_id):
                manager.delete_student(student_id)
                print("学生删除成功")
            else:
                print("学生不存在")
        
        elif choice == '3':
            student_id = int(input("输入要更新的学生ID: "))
            student = manager.get_student(student_id)
            if not student:
                print("学生不存在")
                continue
            
            print("当前信息:")
            print(f"1. 姓名: {student[1]}")
            print(f"2. 年龄: {student[2]}")
            print(f"3. 性别: {student[3]}")
            print(f"4. 专业: {student[4]}")
            print(f"5. 成绩: {student[5]}")
            
            fields = input("选择要更新的字段(1-5, 多个用逗号分隔): ").split(',')
            updates = {}
            
            for field in fields:
                field = field.strip()
                if field == '1':
                    updates['name'] = input("新姓名: ")
                elif field == '2':
                    updates['age'] = int(input("新年龄: "))
                elif field == '3':
                    updates['gender'] = input("新性别(M/F): ").upper()
                elif field == '4':
                    updates['major'] = input("新专业: ")
                elif field == '5':
                    updates['grade'] = float(input("新成绩: "))
            
            if updates:
                manager.update_student(student_id, **updates)
                print("学生信息更新成功")
        
        elif choice == '4':
            student_id = int(input("输入要查询的学生ID: "))
            student = manager.get_student(student_id)
            if student:
                print("\n学生信息:")
                print(f"ID: {student[0]}")
                print(f"姓名: {student[1]}")
                print(f"年龄: {student[2]}")
                print(f"性别: {student[3]}")
                print(f"专业: {student[4]}")
                print(f"成绩: {student[5]}")
            else:
                print("学生不存在")
        
        elif choice == '5':
            students = manager.list_students()
            print("\n所有学生:")
            for student in students:
                print(f"{student[0]}: {student[1]}, {student[2]}岁, {student[4]}专业, 成绩: {student[5]}")
        
        elif choice == '6':
            print("筛选条件:")
            print("1. 按专业")
            print("2. 按性别")
            print("3. 按年龄范围")
            filter_choice = input("选择筛选方式(1-3): ")
            
            if filter_choice == '1':
                major = input("输入专业名称: ")
                students = manager.list_students("major", major)
            elif filter_choice == '2':
                gender = input("输入性别(M/F): ").upper()
                students = manager.list_students("gender", gender)
            elif filter_choice == '3':
                min_age = int(input("最小年龄: "))
                max_age = int(input("最大年龄: "))
                students = [s for s in manager.list_students() 
                           if min_age <= s[2] <= max_age]
            else:
                print("无效选择")
                continue
            
            print("\n筛选结果:")
            for student in students:
                print(f"{student[0]}: {student[1]}, {student[2]}岁, {student[4]}专业, 成绩: {student[5]}")
        
        elif choice == '7':
            total, avg_grade, max_grade, min_grade = manager.get_statistics()
            print("\n统计信息:")
            print(f"学生总数: {total}")
            print(f"平均成绩: {avg_grade:.2f}")
            print(f"最高成绩: {max_grade}")
            print(f"最低成绩: {min_grade}")
        
        elif choice == '8':
            print("退出系统")
            break
        
        else:
            print("无效输入")

if __name__ == "__main__":
    student_system()

学习要点:SQLite数据库操作、CRUD实现、上下文管理器、数据统计

脚本10:Web开发 - Flask博客系统

# 使用Flask框架的简易博客系统
from flask import Flask, render_template, request, redirect, url_for, flash
import sqlite3
from contextlib import closing
import os

app = Flask(__name__)
app.secret_key = 'your_secret_key_here'
DATABASE = 'blog.db'

def init_db():
    with closing(sqlite3.connect(DATABASE)) as conn:
        with conn:
            conn.execute("""
            CREATE TABLE IF NOT EXISTS posts (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                title TEXT NOT NULL,
                content TEXT NOT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
            """)
            conn.execute("""
            CREATE TABLE IF NOT EXISTS comments (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                post_id INTEGER NOT NULL,
                author TEXT NOT NULL,
                content TEXT NOT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY(post_id) REFERENCES posts(id)
            )
            """)

def get_db():
    db = sqlite3.connect(DATABASE)
    db.row_factory = sqlite3.Row
    return db

@app.route('/')
def index():
    db = get_db()
    posts = db.execute('SELECT * FROM posts ORDER BY created_at DESC').fetchall()
    db.close()
    return render_template('index.html', posts=posts)

@app.route('/post/<int:post_id>')
def show_post(post_id):
    db = get_db()
    post = db.execute('SELECT * FROM posts WHERE id = ?', (post_id,)).fetchone()
    comments = db.execute('SELECT * FROM comments WHERE post_id = ? ORDER BY created_at', 
                         (post_id,)).fetchall()
    db.close()
    
    if post is None:
        flash('文章不存在')
        return redirect(url_for('index'))
    
    return render_template('post.html', post=post, comments=comments)

@app.route('/create', methods=['GET', 'POST'])
def create_post():
    if request.method == 'POST':
        title = request.form['title']
        content = request.form['content']
        
        if not title or not content:
            flash('标题和内容不能为空')
        else:
            db = get_db()
            db.execute('INSERT INTO posts (title, content) VALUES (?, ?)', 
                      (title, content))
            db.commit()
            db.close()
            flash('文章创建成功')
            return redirect(url_for('index'))
    
    return render_template('create.html')

@app.route('/post/<int:post_id>/comment', methods=['POST'])
def add_comment(post_id):
    author = request.form['author']
    content = request.form['content']
    
    if not author or not content:
        flash('昵称和评论内容不能为空')
    else:
        db = get_db()
        db.execute('INSERT INTO comments (post_id, author, content) VALUES (?, ?, ?)', 
                  (post_id, author, content))
        db.commit()
        db.close()
        flash('评论添加成功')
    
    return redirect(url_for('show_post', post_id=post_id))

@app.route('/post/<int:post_id>/delete', methods=['POST'])
def delete_post(post_id):
    db = get_db()
    db.execute('DELETE FROM posts WHERE id = ?', (post_id,))
    db.execute('DELETE FROM comments WHERE post_id = ?', (post_id,))
    db.commit()
    db.close()
    flash('文章删除成功')
    return redirect(url_for('index'))

if __name__ == '__main__':
    if not os.path.exists(DATABASE):
        init_db()
    app.run(debug=True)

模板文件 (templates/index.html):

<!DOCTYPE html>
<html>
<head>
    <title>我的博客</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
        .post { margin-bottom: 30px; border-bottom: 1px solid #eee; padding-bottom: 20px; }
        .post h2 a { color: #333; text-decoration: none; }
        .post-meta { color: #666; font-size: 0.9em; }
        .flash-message { padding: 10px; margin: 10px 0; background: #f0f0f0; }
    </style>
</head>
<body>
    <h1>我的博客</h1>
    <a href="{{ url_for('create_post') }}">写新文章</a>
    
    {% with messages = get_flashed_messages() %}
        {% if messages %}
            {% for message in messages %}
                <div class="flash-message">{{ message }}</div>
            {% endfor %}
        {% endif %}
    {% endwith %}
    
    {% for post in posts %}
        <div class="post">
            <h2><a href="{{ url_for('show_post', post_id=post['id']) }}">{{ post['title'] }}</a></h2>
            <div class="post-meta">发布于 {{ post['created_at'] }}</div>
            <p>{{ post['content'][:200] }}{% if post['content']|length > 200 %}...{% endif %}</p>
            <a href="{{ url_for('show_post', post_id=post['id']) }}">阅读更多</a>
        </div>
    {% endfor %}
</body>
</html>

模板文件 (templates/post.html):

<!DOCTYPE html>
<html>
<head>
    <title>{{ post['title'] }}</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
        .post { margin-bottom: 30px; }
        .post-meta { color: #666; font-size: 0.9em; }
        .comments { margin-top: 40px; }
        .comment { margin-bottom: 20px; padding: 10px; background: #f9f9f9; }
        .comment-meta { color: #666; font-size: 0.8em; }
        .flash-message { padding: 10px; margin: 10px 0; background: #f0f0f0; }
        form { margin-top: 20px; }
        textarea { width: 100%; height: 100px; }
    </style>
</head>
<body>
    <a href="{{ url_for('index') }}">返回首页</a>
    
    {% with messages = get_flashed_messages() %}
        {% if messages %}
            {% for message in messages %}
                <div class="flash-message">{{ message }}</div>
            {% endfor %}
        {% endif %}
    {% endwith %}
    
    <div class="post">
        <h1>{{ post['title'] }}</h1>
        <div class="post-meta">发布于 {{ post['created_at'] }}</div>
        <p>{{ post['content'] }}</p>
        
        <form action="{{ url_for('delete_post', post_id=post['id']) }}" method="post">
            <input type="submit" value="删除文章" onclick="return confirm('确定删除吗?')">
        </form>
    </div>
    
    <div class="comments">
        <h3>评论 ({{ comments|length }})</h3>
        
        {% for comment in comments %}
            <div class="comment">
                <div class="comment-meta">
                    {{ comment['author'] }} 发布于 {{ comment['created_at'] }}
                </div>
                <p>{{ comment['content'] }}</p>
            </div>
        {% endfor %}
        
        <h3>发表评论</h3>
        <form action="{{ url_for('add_comment', post_id=post['id']) }}" method="post">
            <div>
                <label for="author">昵称:</label>
                <input type="text" id="author" name="author" required>
            </div>
            <div>
                <label for="content">评论内容:</label>
                <textarea id="content" name="content" required></textarea>
            </div>
            <input type="submit" value="提交评论">
        </form>
    </div>
</body>
</html>

模板文件 (templates/create.html):

<!DOCTYPE html>
<html>
<head>
    <title>写新文章</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
        form div { margin-bottom: 10px; }
        input[type="text"], textarea { width: 100%; }
        textarea { height: 300px; }
        .flash-message { padding: 10px; margin: 10px 0; background: #f0f0f0; }
    </style>
</head>
<body>
    <h1>写新文章</h1>
    <a href="{{ url_for('index') }}">返回首页</a>
    
    {% with messages = get_flashed_messages() %}
        {% if messages %}
            {% for message in messages %}
                <div class="flash-message">{{ message }}</div>
            {% endfor %}
        {% endif %}
    {% endwith %}
    
    <form action="{{ url_for('create_post') }}" method="post">
        <div>
            <label for="title">标题:</label>
            <input type="text" id="title" name="title" required>
        </div>
        <div>
            <label for="content">内容:</label>
            <textarea id="content" name="content" required></textarea>
        </div>
        <input type="submit" value="发布文章">
    </form>
</body>
</html>

学习要点:Flask框架、Web开发、数据库集成、模板渲染、表单处理

总结
这10个Python脚本涵盖了从基础到高级的多个方面:

1.基础语法和流程控制

2.数据结构应用

3.文件操作和正则表达式

4.面向对象编程

5.网络请求和API调用

6.多线程编程

7.数据处理和分析

8.GUI应用程序开发

9.数据库操作

10.Web开发框架

每个脚本都设计为实用且具有教育意义,通过实际项目学习Python是最有效的方式。建议你从第一个脚本开始,逐步完成所有项目,并在每个项目基础上进行扩展和改进,这样可以真正掌握Python编程的精髓。

👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

👉Python必备开发工具👈

在这里插入图片描述
👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

14个Python自动化实战脚本 利用BeautifulSoup和requests库,编写Python爬虫获取所需网页信息。在工作中,我们常常需要对大量文件进行批量重命名,Python帮你轻松搞定!告别手动发送,用Python编写定时发送邮件的自动化脚本。简化数据库管理,Python帮你自动化执行CRUD操作。通过Python解析日志文件,提取关键信息进行统计分析。使用Python调度库,实现定时执行任务的自动化脚本。使用Pandas库,实现复杂数据处理和清洗的自动化。通过Python解析邮件,自动化下载所有附件。 阅读详情

相关推荐

【Python 】超实用的适合练手练习Python实战项目,新手小白一学就会,看来试试!!

使用Python来创建动画,就像万花尺一样绘制曲线,我们的spiro.py程序将用Python和参数方程来描述程序的万花尺齿轮的运动,并绘制曲线——螺旋线,我们可以将完成的画图保存为PNG图像文件,并用命令行选项来指定参数或者生成随机曲线。本项目将利用 Reynolds 的 3 个规则,创建一个类鸟群,模拟 N 只鸟的群体行为,并画出随着时间的推移,它们的位置和运动方向。此仓库中放置的一系列的python小项目,均是我本人亲自敲过的,有的来自各种书本,有的是网上收集的。该图像的尺寸与深度图一致;

2301_78040773的博客 491

10个常用Python自动化脚本

大家好,Python凭借其简单和通用性,能够为解决每天重复同样的工作提供最佳方案。本文将探索10个Python脚本,这些脚本可以帮助自动化完成任务,提高工作效率。无论是开发者、数据分析师还是仅仅想简化工作流程的普通用户,这些脚本都能提供帮助。

csdn1561168266的博客 4万+

AI Agent技能评测框架SkillsBench:从黑盒评估到白盒技能拆解

在人工智能领域,模型评估是衡量技术进展的核心环节。传统评测基准如GLUE、MMLU主要关注模型的通用认知能力,但实际工程应用中,AI Agent需要的是在复杂场景中协调多种能力的“职业技能”。SkillsBench创新性地将Agent能力进行原子化拆解,定义了理解规划、工具调用、推理决策、交互安全等技能维度,并通过领域专家构建的评测集确保生态效度。这一框架为Agent开发提供了精准的“度量衡”,使性能优化从经验驱动转向数据驱动,同时为不同模型和框架提供了公平比较的基础,推动了AI Agent生态从“野蛮生长

weixin_30530339的博客 389

20个好用到爆的Python实用脚本!

最近小编认真整理了20+个基于python的实战案例,主要包含:数据分析、可视化、机器学习/深度学习、时序预测等,案例的主要特点:提供源码:代码都是基于jupyter notebook,附带一定的注释,运行即可数据齐全:大部分案例都有提供数据,部分案例使用内置数据集(1)不同内存下的销量(代码片段)(2)不同闪存Ram下的价格分布(代码片段)不同店铺下的点评数量对比:4个指标的关系:口味、环境、服务和人均消费RFM模型是客户关系管理(CRM)中的一种重要分析模型,用于衡量客户价值和客户创利能力。

Python栈 5140

超越界面设计:GUI Guider与LVGL在STM32F103上的系统集成与架构思考

本文探讨了GUI Guider与LVGL在STM32F103微控制器上的系统集成与架构设计,重点分析了工程模块化组织、内存管理优化、硬件驱动接口设计以及FreeRTOS多任务集成。针对STM32F103ZET6的资源限制,提供了实用的移植策略和性能优化方案,帮助开发者构建高效、可维护的嵌入式GUI系统。

j2k3l4的博客 922

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 663

高淇python400集课堂笔记_魔力耳朵重磅推出1对1课堂“全班型”满足更多中国家庭教育需求...

2020年,是魔力耳朵飞跃成长的一年,为了更好满足用户教育需求,为更多中国家庭提供适合中国孩子学习的在线少儿英语课堂,魔力耳朵今年“全”面出发,不仅于近日升级为支持“全设备”上课的系统,并将于8月1日新推出“1对1”在线课堂,为不同年龄、不同基础、不同需求的家庭提供更多样化选择。至此,魔力耳朵支持“全班型”上课,也是行业一家集1对4、1对2小班课堂,及1对1课堂的在线少儿英语平台。魔力耳朵新推1对...

weixin_39872893的博客 199

Win10+Anaconda环境下PaddleOCR保姆级安装指南(附常见报错解决方案)

本文提供Win10+Anaconda环境下PaddleOCR的保姆级安装指南,涵盖从环境配置到模型部署的全流程,特别针对常见报错提供解决方案。通过详细的步骤说明和实用技巧,帮助开发者快速完成PaddleOCR安装与测试,避免常见陷阱,提升OCR开发效率。

weixin_29096377的博客 375

10 个杀手级的 Python 自动化脚本

真不错哦

z099164的博客 4219

同步整流buck电路图设计:手把手入门必看

从零开始拆解同步整流Buck电路图及其原理,手把手带你画出关键拓扑、选型MOSFET、分析续流路径。重点讲清占空比控制逻辑与体二极管导通损耗的规避方法,让buck电路图及其原理真正落地可调、稳定可靠。

weixin_33308579的博客 995

FPGA新手避坑指南:手把手教你搞定RTL8211千兆网PHY的时序配置(附Verilog代码)

本文详细解析了FPGA与RTL8211千兆网PHY芯片的时序配置问题,重点介绍了TXDLY/RXDLY引脚设置、FPGA发送端和接收端的Verilog实现,以及调试与验证的完整流程。通过硬件电路设计和代码示例,帮助开发者解决网络连接不稳定、丢包等常见问题,提升千兆网通信的稳定性。

weixin_28732953的博客 542

怎么学习python脚本

学习 Python 脚本的方法有很多种,下面是一些建议: 安装 Python 环境:首先,你需要安装 Python 的运行环境。你可以在 Python 官网下载并安装最新版本的 Python,或者使用跨平台的 Python 发行版,如 Anaconda。 学习 Python 基础语法:学习 Python 脚本的第一步是学习 Python 的基础语法。你可以参考 Python 官方文档或者一些在...

weixin_35749545的博客 766

MaxEnt软件的下载与安装

1、下载网站:http://lucky-boy.ys168.com/ (这是之前在网上搜到的,里面有许多软件安装包,感谢网页主的资源共享,违权必删)

weixin_42191203的博客 2万+

6个实用的 Python 自动化脚本,让你每天轻轻松松

每天你都可能会执行许多重复的任务,例如阅读 pdf、播放音乐、查看天气、打开书签、清理文件夹等等,使用自动化脚本,就无需手动一次又一次地完成这些任务,非常方便。而在某种程度上,Python 就是自动化的代名词。今天分享 6 个非常有用的 Python 自动化脚本。

WANGJUNAIJIAO的博客 2558

影像组学分析流程中,图像分割前要做的事(图像预处理)

在InputVolume中无法找到自己想要重采样的序列,这时可以检查一下序列的Volume type是不是MRMLMulti。这时,Volume type将由MRMLMulti改为Scaler,随后即可在3D slicer中完成Resample Scaler Volume。2.1、重采样:通过3Dslicer中的Resample Scaler Volume实现。具体设置参数:spacing(1,1,1),Interpolation选择Bspline。2、图像预处理:重采样和标准化。

weixin_45011313的博客 3724

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

16个好用到爆的Python实用脚本!

每个脚本都有其特定的用途,并且我会附上相应的源码。这些脚本涵盖了数据处理、网络请求、文件操作等多个方面,非常适合初学者和进阶者学习和使用。

2301_78096295的博客 1594

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

30 个Python代码实现的常用功能,精心整理版

1、冒泡排序 私信小编01即可获大量Python学习资料 2、计算x的n次方的方法 3、计算aa + bb + c*c + …… 4、计算阶乘 n! 5、列出当前目录下的所有文件和目录名。最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~ 6、把一个list中所有的字符串变成小写: 7、输出某个路径下的所有文件和文件夹的路径 8、输出某个路径及其子目录下的所

每日分享程序员技巧 1343

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

5个实用的自动化Python脚本

Python 是一种功能强大的语言,广泛用于自动执行各种任务。无论您是开发人员、系统管理员,还是只是想通过自动化日常任务来节省时间的人,Python 都能满足您的需求。这里有 5 个 Python 脚本,可以帮助您自动执行各种任务。

金戈鐡馬 5661

10 个超级高效实用的 Python 自动化脚本!

重复性任务总是耗时且无聊,想一想你想要一张一张地裁剪 100 张照片或 Fetch API、纠正拼写和语法等工作,所有这些任务都很耗时,为什么不自动化它们呢?在今天的文章中,我将与你分享 10 个 Python 自动化脚本。现在,让我们开始吧。

2301_76161259的博客 3663

如何使用Python脚本

如何使用Python脚本

Java癫疯的博客 1万+

十个常见的 Python 脚本 (详细介绍 + 代码举例)

介绍: 该脚本用于批量重命名指定目录下的文件,例如将所有 “.txt” 文件重命名为 “.md” 文件。介绍: 该脚本用于爬取网页数据,例如新闻标题、商品价格等,并可以将数据保存到本地或数据库。介绍: 该脚本用于数据可视化,例如绘制图表、生成报表等,可以更直观地展示数据。介绍: 该脚本用于读取 CSV 文件,并可以根据需要对数据进行处理和分析。介绍: 该脚本用于发送邮件通知,例如在脚本执行完毕后发送邮件通知管理员。介绍: 该脚本用于将数据写入 CSV 文件,可以用于数据存储和导出。

m0_74825360的博客 1359

Python脚本该如何开发?需要学习什么?本文将带你深入Python,希望对你有所帮助

Python 是一种功能强大且易于学习的编程语言 使用 Python 开发脚本可以帮助你自动化许多日常任务 提高工作效率 本文将为你提供一个使用 Python 开发脚本的学习路线 并结合一些代码示例 帮助你快速入门和掌握这项技能以上是使用 Python 开发脚本的基本学习路线 通过循序渐进地学习 你将逐步掌握这项技能 并能够应用到各种实际场景中!

HSX的博客 1683

十个Python实用脚本,快用起来

在日常的工作中,我们总会面临到各式各样的问题。 其中不少的问题,使用一些简单的Python代码就能解决。 不久前的复旦大佬,用130行Python代码硬核搞定核酸统计,大大提升了效率,节省了不少时间。 今天,就带大家学习一下10个Python脚本程序。 虽然简单,不过还是蛮有用的。 有兴趣的可以自己去实现,找到对自己有帮助的技巧。 1、jpg转png 编写一个Python脚本就能完成各种图片格式的转换,此处以jpg转成png为例。 有两种解决方法,都分享给大家。 #图片格式转换,..

西楼的博客 2万+

50个常用Python脚本

【代码】50个常用Python脚本。

m0_55877125的博客 1万+

Web安全和渗透测试有什么关系?

做渗透测试的一个环节就是测试web安全,需要明白漏洞产生原理,通过信息收集互联网暴露面,进行漏洞扫描,漏洞利用,必要时进行脚本自编写和手工测试,力求挖出目标存在的漏洞并提出整改建议,当然如果技术再精一些,还要学习内网渗透(工作组和域环境),白盒审计,app,小程序渗透那些了......可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。总之,web安全包含于渗透测试,但不是渗透测试的全部。

Python_0011的博客 4858

python脚本学习

Python脚本制作

jrdh的博客 264
上一篇: Python爬取微博数据实战教程(附完整代码)
下一篇: Python自动化神器大盘点:这10个库让你效率提升10倍!
Python_trys
博客等级 码龄2年 4369粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值