引言:为什么选择Python作为信息技术自动化的首选语言?

Python作为一种高级编程语言,凭借其简洁的语法、强大的生态系统和广泛的应用场景,已经成为信息技术领域自动化处理的首选工具。无论你是系统管理员、数据分析师还是普通办公人员,Python都能帮助你大幅提升工作效率。

Python在信息技术领域的核心优势:

  • 语法简洁易懂:Python的语法接近自然语言,初学者可以快速上手
  • 丰富的标准库:内置了大量模块,无需额外安装即可处理文件、网络、系统等任务
  • 强大的第三方生态:通过pip可以轻松安装各种专业库,如pandas、openpyxl、requests等
  • 跨平台兼容性:可以在Windows、Linux、macOS等各种操作系统上运行

第一部分:Python基础环境搭建与语法入门

1.1 Python环境安装与配置

安装Python解释器

访问Python官网(https://www.python.org/downloads/)下载最新版本的Python 3.x。安装时务必勾选”Add Python to PATH”选项,这样可以在命令行中直接使用python命令。

验证安装是否成功:

# 在命令行中输入以下命令
python --version
# 或者
python3 --version

选择合适的开发工具

  • 初学者推荐:VS Code + Python扩展
  • 轻量级选择:Sublime Text、Notepad++
  • 专业选择:PyCharm Community Edition

1.2 Python基础语法快速入门

变量与数据类型

Python是动态类型语言,无需声明变量类型:

# 整数
age = 25
# 浮点数
salary = 8500.50
# 字符串
name = "张三"
# 布尔值
is_active = True
# 列表(数组)
departments = ["技术部", "财务部", "人事部"]
# 字典(键值对)
employee = {"name": "张三", "age": 25, "department": "技术部"}

条件判断与循环结构

# if-elif-else 条件判断
score = 85
if score >= 90:
    grade = "优秀"
elif score >= 80:
    grade = "良好"
elif score >= 60:
    grade = "及格"
else:
    grade = "不及格"

# for 循环遍历列表
for dept in departments:
    print(f"部门:{dept}")

# while 循环
count = 0
while count < 5:
    print(f"当前计数:{count}")
    count += 1

函数定义与使用

def calculate_bonus(salary, performance):
    """计算员工奖金"""
    base_bonus = salary * 0.1
    if performance >= 90:
        multiplier = 1.5
    elif performance >= 0.8:
        bonus = 1.2
    else:
        multiplier = 1.0
    return base_bonus * multiplier

# 调用函数
bonus = calculate_bonus(8500, 95)
print(f"计算得到的奖金:{bonus}")

第二部分:Python文件操作与数据处理基础

2.1 文件读写操作

文本文件处理

# 写入文件
with open('employee_list.txt', 'w', encoding='utf-8') as f:
    f.write("员工姓名,部门,工资\n")
    f.write("张三,技术部,8500\n")
    f.write("李四,财务部,9200\n")
    f.write("王五,人事部,7800\n")

# 读取文件
with open('employee_list.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print("文件内容:")
    print(content)

# 逐行读取
with open('employee_list.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()
    for line in lines:
        print(line.strip())  # strip()去除换行符

CSV文件处理(重要数据处理场景)

import csv

# 写入CSV文件
def write_csv(filename, data):
    """将数据写入CSV文件"""
    with open(filename, 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(['姓名', '部门', '工资', '入职日期'])
        writer.writerows(data)

# 示例数据
employee_data = [
    ['张三', '技术部', 8500, '2020-01-15'],
    ['李四', '财务部', 9200, '2019-03-20'],
    ['王五', '人事部', 7800, '2021-06-10']
]

write_csv('employees.csv', employee_data)

# 读取CSV文件
def read_csv(filename):
    """从CSV文件读取数据"""
    with open(filename, 'r', encoding='utf-8') as f:
        reader = csv.reader(f)
        headers = next(reader)  # 获取表头
        data = list(reader)
        return headers, data

headers, data = read_csv('employees.csv')
print("表头:", headers)
print("数据:")
for row in data:
    print(row)

2.2 Excel文件处理(办公自动化核心技能)

使用openpyxl库处理Excel

首先安装库:pip install openpyxl

from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, PatternFill, Alignment

def create_excel_report():
    """创建员工工资报表"""
    wb = Workbook()
    ws = wb.active
    ws.title = "员工工资表"
    
    # 设置表头
    headers = ['员工编号', '姓名', '部门', '工资', '奖金', '总收入']
    ws.append(headers)
    
    # 添加数据
    employees = [
        ['001', '张三', '技术部', 8500, 2000],
        ['002', '李四', '财务部', 9200, 2500],
        ['003', '王五', '人事部', 7800, 1500],
        ['004', '赵六', '技术部', 8800, 2200]
    ]
    
    for emp in employees:
        # 计算总收入
        total_income = emp[3] + emp[4]
        ws.append(emp + [total_income])
    
    # 设置样式
    # 表头样式
    header_font = Font(bold=True, color="FFFFFF")
    header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
    header_alignment = Alignment(horizontal="center")
    
    for cell in ws[1]:
        cell.font = header_font
        cell.fill = header_fill
        cell.alignment = header_alignment
    
    # 自动调整列宽
    for column in ws.columns:
        max_length = 0
        column_letter = column[0].column_letter
        for cell in column:
            try:
                if len(str(cell.value)) > max_length:
                    max_length = len(str(cell.value))
            except:
                pass
        adjusted_width = (max_length + 2) * 1.2
        ws.column_dimensions[column_letter].width = adjusted_width
    
    # 保存文件
    wb.save('员工工资报表.xlsx')
    print("Excel报表创建成功!")

# 调用函数
create_excel_report()

读取Excel文件数据

def read_excel_data(filename):
    """读取Excel文件并进行数据分析"""
    wb = load_workbook(filename)
    ws = wb.active
    
    # 获取所有数据
    data = []
    for row in ws.iter_rows(min_row=2, values_only=True):  # 跳过表头
        data.append(row)
    
    # 数据分析示例
    total_employees = len(data)
    total_salary = sum(row[3] for row in data)  # 工资列
    total_bonus = sum(row[4] for row in data)   # 奖金列
    avg_salary = total_salary / total_employees
    
    print(f"员工总数:{total_employees}")
    print(f"总工资支出:{total_salary}")
    print(f"总奖金支出:{total_bonus}")
    print(f"平均工资:{avg_salary:.2f}")
    
    # 按部门统计
    dept_stats = {}
    for row in data:
        dept = row[2]
        salary = row[3]
        if dept not in dept_stats:
            dept_stats[dept] = {'count': 0, 'total_salary': 0}
        dept_stats[dept]['count'] += 1
        dept_stats[dept]['total_salary'] += salary
    
    print("\n部门统计:")
    for dept, stats in dept_stats.items():
        print(f"{dept}: {stats['count']}人, 平均工资: {stats['total_salary']/stats['count']:.2f}")

# 使用示例
read_excel_data('员工工资报表.xlsx')

2.3 JSON数据处理(API数据交互)

import json

# JSON数据示例
employee_json = '''
{
    "company": "ABC科技有限公司",
    "employees": [
        {"name": "张三", "department": "技术部", "salary": 8500},
        {"name": "1" "department": "财务部", "salary": 9200}
    ]
}
'''

# 解析JSON
data = json.loads(employee_json)
print("公司名称:", data["company"])
print("员工列表:")
for emp in data["employees"]:
    print(f"  {emp['name']} - {emp['department']} - 工资: {emp['salary']}")

# 将Python对象转换为JSON
employee_list = [
    {"name": "张三", "department": "技术部", "salary": 8500},
    {"name": "李四", "department": "财务部", "salary": 1"200"}
]

json_str = json.dumps(employee_list, ensure_ascii=False, indent=2)
print("生成的JSON:")
print(json_str)

# 保存JSON到文件
with open('employees.json', 'w', encoding='utf-8') as f:
    json.dump(employee_list, f, ensure_ascii=False, indent=2)

第三部分:Python自动化脚本编写技巧

3.1 自动化文件管理

批量重命名文件

import os
import shutil
from datetime import datetime

def batch_rename_files(directory, prefix="document"):
    """
    批量重命名指定目录下的文件
    例如:将所有文件重命名为 document_20240101_001.txt
    """
    if not os.path.exists(directory):
        print(f"目录不存在: {directory}")
        return
    
    files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
    
    if not files:
        print("目录中没有文件")
        return
    
    # 按修改时间排序
    files.sort(key=lambda x: os.path.getmtime(os.path.join(directory, x)))
    
    date_str = datetime.now().strftime("%Y%m%d")
    counter = 1
    
    for filename in files:
        # 获取文件扩展名
        name, ext = os.path.splitext(filename)
        
        # 构建新文件名
        new_name = f"{prefix}_{date_str}_{str(counter).zfill(3)}{ext}"
        
        # 完整路径
        old_path = os.path.join(directory, filename)
        new_path = os.path.join(directory, new_name)
        
        # 重命名
        try:
            os.rename(old_path, new_path)
            print(f"重命名: {filename} -> {new_name}")
            counter += 1
        except Exception as e:
            print(f"重命名失败: {filename}, 错误: {e}")

# 使用示例
# batch_rename_files("./downloads", "report")

自动备份重要文件

import shutil
from datetime import datetime
import schedule
import time

def backup_files(source_dir, backup_dir):
    """备份文件到指定目录"""
    # 创建备份目录(如果不存在)
    if not os.path.exists(backup_dir):
        os.makedirs(backup_dir)
    
    # 生成备份文件名(带时间戳)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    backup_name = f"backup_{timestamp}.zip"
    backup_path = os.path.join(backup_dir, backup_name)
    
    try:
        # 创建zip压缩包
        shutil.make_archive(backup_path.replace('.zip', ''), 'zip', source_dir)
        print(f"备份成功: {backup_path}")
        return True
    except Exception as e:
        print(f"备份失败: {e}")
        return False

# 定时备份(每天凌晨2点执行)
def schedule_backup():
    schedule.every().day.at("02:00").do(backup_files, 
                                         source_dir="./important_docs", 
                                         backup_dir="./backups")
    
    while True:
        schedule.run_pending()
        time.sleep(60)  # 每分钟检查一次

# 如果需要运行定时任务,取消下面注释
# schedule_backup()

3.2 自动化办公文档处理

批量生成Word文档

首先安装:pip install python-docx

from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

def generate_contracts(employee_list, template_data):
    """批量生成员工合同"""
    for emp in employee_list:
        doc = Document()
        
        # 标题
        title = doc.add_heading('劳动合同', 0)
        title.alignment = WD_ALIGN_PARAGRAPH.CENTER
        
        # 正文内容
        p = doc.add_paragraph()
        p.add_run(f'甲方(用人单位):{template_data["company_name"]}\n')
        p.add_run(f'乙方(员工):{emp["name"]}\n')
        p.add_run(f'部门:{emp["department"]}\n')
        p.add_run(f'工资:{emp["salary"]}元/月\n')
        
        # 设置字体
        for paragraph in doc.paragraphs:
            for run in paragraph.runs:
                run.font.size = Pt(12)
                run.font.name = '宋体'
        
        # 保存文档
        filename = f"劳动合同_{emp['name']}.docx"
        doc.save(filename)
        print(f"生成合同: {filename}")

# 使用示例
employees = [
    {"name": "张三", "department": "技术部", "salary": 8500},
    {"name": "李四", "department": "财务部", "salary": 9200}
]
template = {"company_name": "ABC科技有限公司"}
generate_contracts(employees, template)

自动化邮件发送

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

def send_email_with_attachment(to_email, subject, body, attachment_path):
    """发送带附件的邮件"""
    # 邮件配置
    smtp_server = "smtp.163.com"  # 例如163邮箱
    smtp_port = 587
    sender_email = "your_email@163.com"
    sender_password = "your_app_password"  # 使用授权码
    
    # 创建邮件对象
    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = to_email
    msg['Subject'] = subject
    
    # 添加正文
    msg.attach(MIMEText(body, 'plain', 'utf-8'))
    
    # 添加附件
    if attachment_path and os.path.exists(attachment_path):
        with open(attachment_path, 'rb') as f:
            part = MIMEBase('application', 'octet-stream')
            part.set_payload(f.read())
            encoders.encode_base64(part)
            part.add_header('Content-Disposition', f'attachment; filename={os.path.basename(attachment_path)}')
            msg.attach(part)
    
    # 发送邮件
    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()
        server.login(sender_email, sender_password)
        server.send_message(msg)
        server.quit()
        print(f"邮件发送成功至: {to_email}")
        return True
    except Exception as e:
        print(f"邮件发送失败: {e}")
        return False

# 批量发送邮件示例
def batch_send_salary_slips(employee_list):
    """批量发送工资条邮件"""
    for emp in employee_list:
        subject = f"{emp['name']}的工资条"
        body = f"""
尊敬的{emp['name']}:

您好!您的本月工资信息如下:
- 基本工资:{emp['salary']}元
- 奖金:{emp['bonus']}元
- 扣税:{emp['tax']}元
- 实发工资:{emp['actual_salary']}元

如有疑问,请联系财务部。

此致
敬礼
        """
        # 假设附件是已生成的工资条PDF
        attachment = f"工资条_{emp['name']}.pdf"
        send_email_with_attachment(emp['email'], subject, body, attachment)

3.3 网页数据抓取与API调用

使用requests库获取网页数据

首先安装:pip install requests beautifulsoup4

import requests
from bs4 import BeautifulSoup
import time

def scrape_website_info(url, headers=None):
    """
    网页数据抓取示例:获取网站标题和主要内容
    """
    if headers is None:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
    
    try:
        # 发送HTTP请求
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 如果状态码不是200,抛出异常
        
        # 解析HTML
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 提取信息
        title = soup.title.string if soup.title else "无标题"
        
        # 提取所有段落文本
        paragraphs = soup.find_all('p')
        content = "\n".join([p.get_text().strip() for p in paragraphs[:5]])  # 只取前5段
        
        return {
            'url': url,
            'title': title,
            'content': content[:500] + "..." if len(content) > 500 else content
        }
        
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return None

# 使用示例
# result = scrape_website_info("https://example.com")
# if result:
#     print(f"标题: {result['title']}")
#     print(f"内容: {result['content']}")

调用API获取数据

import requests
import json

def get_weather_forecast(city):
    """获取天气预报数据(示例使用免费API)"""
    # 注意:实际使用时需要申请API key
    api_key = "your_api_key_here"
    url = f"http://api.openweathermap.org/data/2.5/weather"
    
    params = {
        'q': city,
        'appid': api_key,
        'units': 'metric',  # 摄氏温度
        'lang': 'zh_cn'     # 中文结果
    }
    
    try:
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()
        
        data = response.json()
        
        if data['cod'] == 200:
            weather = {
                'city': data['name'],
                'temp': data['main']['temp'],
                'description': data['weather'][0]['description'],
                'humidity': data['main']['humidity']
            }
            return weather
        else:
            print(f"API错误: {data.get('message', '未知错误')}")
            return None
            
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return None

# 使用示例
# weather = get_weather_forecast("Beijing")
# if weather:
#     print(f"{weather['city']}天气:{weather['description']}, 温度: {weather['temp']}°C")

第四部分:综合实战案例

4.1 案例一:自动化办公数据处理系统

场景描述:某公司每月需要从多个部门收集Excel报表,合并处理后生成汇总报告,并自动发送给管理层。

import pandas as pd
import os
from datetime import datetime

class AutoReportSystem:
    def __init__(self, input_dir, output_dir):
        self.input_dir = input_dir
        self.output_dir = output_dir
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
    
    def merge_excel_files(self):
        """合并多个Excel文件"""
        all_data = []
        
        # 遍历输入目录下的所有Excel文件
        for filename in os.listdir(self.input_dir):
            if filename.endswith('.xlsx') or filename.endswith('.xls'):
                filepath = os.path.join(self.input_dir, filename)
                try:
                    # 读取Excel文件
                    df = pd.read_excel(filepath)
                    # 添加来源文件名(用于追踪)
                    df['来源文件'] = filename
                    all_data.append(df)
                    print(f"成功读取: {filename}")
                except Exception as e:
                    print(f"读取失败 {filename}: {e}")
        
        if not all_data:
            print("没有找到可处理的Excel文件")
            return None
        
        # 合并所有数据
        merged_df = pd.concat(all_data, ignore_index=True)
        return merged_df
    
    def process_data(self, df):
        """数据处理与分析"""
        # 基础统计
        summary = {
            '总记录数': len(df),
            '部门数量': df['部门'].nunique(),
            '总工资': df['工资'].sum(),
            '平均工资': df['工资'].mean(),
            '最高工资': df['工资'].max(),
            '最低工资': df['工资'].min()
        }
        
        # 按部门统计
        dept_stats = df.groupby('部门').agg({
            '工资': ['sum', 'mean', 'count']
        }).round(2)
        
        # 按月份统计(假设有日期列)
        if '入职日期' in df.columns:
            df['入职日期'] = pd.to_datetime(df['入职日期'])
            df['入职月份'] = df['入职日期'].dt.to_period('M')
            monthly_stats = df.groupby('入职月份').agg({
                '工资': 'mean'
            })
            summary['月度统计'] = monthly_stats
        
        return summary, dept_stats
    
    def generate_report(self, summary, dept_stats):
        """生成综合报告"""
        report_date = datetime.now().strftime("%Y年%m月%d日")
        
        # 创建报告文档
        wb = Workbook()
        ws = wb.active
        ws.title = "数据汇总报告"
        
        # 报告标题
        ws.append([f"公司员工数据汇总报告 - {report_date}"])
        ws.append([])  # 空行
        
        # 关键指标
        ws.append(["关键指标"])
        for key, value in summary.items():
            if not isinstance(value, pd.DataFrame):
                ws.append([key, value])
        ws.append([])
        
        # 部门统计
        ws.append(["部门统计"])
        # 写入表头
        ws.append(['部门', '总工资', '平均工资', '人数'])
        # 写入数据
        for dept in dept_stats.index:
            ws.append([
                dept,
                dept_stats.loc[dept, ('工资', 'sum')],
                dept_stats.loc[dept, ('工资', 'mean')],
                dept_stats.loc[dept, ('工资', 'count')]
            ])
        
        # 保存报告
        report_path = os.path.join(self.output_dir, f"汇总报告_{report_date.replace('年','').replace('月','').replace('日','')}.xlsx")
        wb.save(report_path)
        print(f"报告已生成: {report_path}")
        return report_path
    
    def run(self):
        """运行完整流程"""
        print("开始处理数据...")
        
        # 1. 合并数据
        merged_df = self.merge_excel_files()
        if merged_df is None:
            return False
        
        # 2. 处理数据
        summary, dept_stats = self.process_data(merged_df)
        
        # 3. 生成报告
        report_path = self.generate_report(summary, dept_stats)
        
        # 4. 保存合并后的原始数据
        merged_path = os.path.join(self.output_dir, f"合并数据_{datetime.now().strftime('%Y%m%d')}.xlsx")
        merged_df.to_excel(merged_path, index=False)
        
        print("\n处理完成!")
        print(f"合并数据保存至: {merged_path}")
        print(f"汇总报告保存至: {report_path}")
        
        return True

# 使用示例
# system = AutoReportSystem(input_dir="./部门数据", output_dir="./处理结果")
# system.run()

4.2 案例二:系统监控与日志分析自动化

场景描述:自动监控服务器日志文件,检测异常信息,并生成监控报告。

import re
from collections import defaultdict
from datetime import datetime

class LogAnalyzer:
    def __init__(self, log_file):
        self.log_file = log_file
        self.error_patterns = {
            'ERROR': r'ERROR',
            'CRITICAL': r'CRITICAL',
            '异常': r'异常|Exception|Error',
            '超时': r'timeout|超时',
            '连接失败': r'连接失败|Connection refused'
        }
        self.stats = defaultdict(int)
        self.details = defaultdict(list)
    
    def analyze_log(self):
        """分析日志文件"""
        if not os.path.exists(self.log_file):
            print(f"日志文件不存在: {self.log_file}")
            return False
        
        with open(self.log_file, 'r', encoding='utf-8') as f:
            for line_num, line in enumerate(f, 1):
                # 统计各类错误
                for error_type, pattern in self.error_patterns.items():
                    if re.search(pattern, line, re.IGNORECASE):
                        self.stats[error_type] += 1
                        # 记录详细信息(只记录前10条)
                        if len(self.details[error_type]) < 10:
                            self.details[error_type].append({
                                'line_num': line_num,
                                'content': line.strip()[:200]  # 截取前200字符
                            })
        
        return True
    
    def generate_report(self):
        """生成分析报告"""
        report = []
        report.append("=" * 60)
        report.append(f"日志分析报告 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        report.append(f"日志文件: {self.log_file}")
        report.append("=" * 60)
        report.append("")
        
        # 总体统计
        total_errors = sum(self.stats.values())
        report.append(f"总错误数: {total_errors}")
        report.append("")
        
        # 详细统计
        report.append("错误类型统计:")
        for error_type, count in sorted(self.stats.items(), key=lambda x: x[1], reverse=True):
            if count > 0:
                report.append(f"  {error_type}: {count}次")
        
        report.append("")
        report.append("详细信息(前10条):")
        for error_type, items in self.details.items():
            if items:
                report.append(f"\n{error_type}:")
                for item in items:
                    report.append(f"  第{item['line_num']}行: {item['content']}")
        
        report_text = "\n".join(report)
        print(report_text)
        
        # 保存报告
        report_file = f"log_analysis_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
        with open(report_file, 'w', encoding='utf-8') as f:
            f.write(report_text)
        
        print(f"\n报告已保存至: {report_file}")
        return report_file

# 使用示例
# analyzer = LogAnalyzer("server.log")
# if analyzer.analyze_log():
#     analyzer.generate_report()

4.3 案例三:自动化数据清洗与转换

场景描述:处理来自不同系统的数据,统一格式,清洗无效数据,转换为标准格式。

import pandas as pd
import numpy as np
from datetime import datetime

class DataCleaner:
    def __init__(self):
        self.cleaning_log = []
    
    def log_action(self, action, details):
        """记录清洗操作"""
        timestamp = datetime.now().strftime("%H:%M:%S")
        log_entry = f"[{timestamp}] {action}: {details}"
        self.cleaning_log.append(log_entry)
        print(log_entry)
    
    def clean_employee_data(self, df):
        """清洗员工数据"""
        original_rows = len(df)
        self.log_action("开始清洗", f"原始数据行数: {original_rows}")
        
        # 1. 去除重复记录
        df = df.drop_duplicates(subset=['员工编号'], keep='first')
        self.log_action("去重", f"删除重复记录: {original_rows - len(df)}条")
        
        # 2. 处理缺失值
        # 工资缺失用平均值填充
        if df['工资'].isnull().any():
            avg_salary = df['工资'].mean()
            df['工资'].fillna(avg_salary, inplace=True)
            self.log_action("填充缺失值", f"工资列用平均值 {avg_salary:.2f} 填充")
        
        # 姓名缺失删除记录
        before = len(df)
        df = df.dropna(subset=['姓名'])
        self.log_action("删除空值", f"删除姓名缺失记录: {before - len(df)}条")
        
        # 3. 数据格式标准化
        # 去除姓名前后空格
        df['姓名'] = df['姓名'].str.strip()
        # 统一部门名称(去除空格)
        df['部门'] = df['部门'].str.strip()
        
        # 4. 异常值处理
        # 工资异常值(超过3倍标准差)
        salary_mean = df['工资'].mean()
        salary_std = df['工资'].std()
        upper_bound = salary_mean + 3 * salary_std
        lower_bound = salary_mean - 3 * salary_std
        
        outliers = df[(df['工资'] > upper_bound) | (df['工资'] < lower_bound)]
        if len(outliers) > 0:
            self.log_action("检测异常值", f"发现{len(outliers)}条工资异常记录")
            # 可以选择删除或标记
            df = df[(df['工资'] <= upper_bound) & (df['工资'] >= lower_bound)]
        
        # 5. 数据类型转换
        df['工资'] = df['工资'].astype(int)
        if '入职日期' in df.columns:
            df['入职日期'] = pd.to_datetime(df['入职日期'], errors='coerce')
        
        # 6. 添加计算列
        if '工资' in df.columns:
            # 税率计算(简化模型)
            def calculate_tax(salary):
                if salary <= 5000:
                    return 0
                elif salary <= 8000:
                    return (salary - 5000) * 0.03
                elif salary <= 17000:
                    return (salary - 5000) * 0.1 - 210
                else:
                    return (salary - 5000) * 0.2 - 1410
            
            df['应纳税额'] = df['工资'].apply(calculate_tax)
            df['实发工资'] = df['工资'] - df['应纳税额']
            self.log_action("计算列", "添加应纳税额和实发工资列")
        
        self.log_action("清洗完成", f"最终数据行数: {len(df)}")
        return df
    
    def export_clean_data(self, df, output_path):
        """导出清洗后的数据"""
        # 添加清洗信息到Excel
        with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
            df.to_excel(writer, sheet_name='清洗后数据', index=False)
            
            # 添加清洗日志
            log_df = pd.DataFrame({'清洗日志': self.cleaning_log})
            log_df.to_excel(writer, sheet_name='清洗日志', index=False)
        
        self.log_action("导出", f"数据已保存至: {output_path}")

# 使用示例
# cleaner = DataCleaner()
# df = pd.read_excel("raw_employee_data.xlsx")
# cleaned_df = cleaner.clean_employee_data(df)
# cleaner.export_clean_data(cleaned_df, "cleaned_employee_data.xlsx")

第五部分:进阶技巧与最佳实践

5.1 错误处理与日志记录

import logging
import traceback

# 配置日志
def setup_logging():
    """配置日志系统"""
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s',
        handlers=[
            logging.FileHandler('automation.log', encoding='utf-8'),
            logging.StreamHandler()  # 同时输出到控制台
        ]
    )

def robust_function_wrapper(func):
    """装饰器:增强函数的健壮性"""
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            logging.error(f"函数 {func.__name__} 执行失败: {e}")
            logging.error(traceback.format_exc())
            return None
    return wrapper

# 使用示例
@robust_function_wrapper
def risky_operation(data):
    """可能出错的操作"""
    if not data:
        raise ValueError("数据为空")
    return data * 2

# 配置日志后使用
setup_logging()
result = risky_operation([])
logging.info(f"操作结果: {result}")

5.2 配置文件管理

import configparser

def create_config():
    """创建配置文件"""
    config = configparser.ConfigParser()
    
    config['DEFAULT'] = {
        'BackupInterval': '24',
        'MaxBackups': '30',
        'LogRetention': '7'
    }
    
    config['DATABASE'] = {
        'Host': 'localhost',
        'Port': '3306',
        'User': 'admin',
        'Password': 'password'
    }
    
    config['EMAIL'] = {
        'SMTPServer': 'smtp.163.com',
        'Sender': 'your_email@163.com',
        'Password': 'your_app_password'
    }
    
    with open('config.ini', 'w', encoding='utf-8') as f:
        config.write(f)
    print("配置文件已创建")

def load_config():
    """加载配置文件"""
    config = configparser.ConfigParser()
    config.read('config.ini', encoding='utf-8')
    
    return {
        'backup_interval': int(config['DEFAULT']['BackupInterval']),
        'db_host': config['DATABASE']['Host'],
        'email_sender': config['EMAIL']['Sender']
    }

# 使用示例
# create_config()
# settings = load_config()
# print(settings)

5.3 性能优化技巧

import time
from functools import wraps

def timer(func):
    """计时装饰器"""
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **1kwargs)
        end = time.time()
        print(f"{func.__name__} 执行时间: {end - start:.4f}秒")
        return result
    return wrapper

# 使用生成器处理大数据
def process_large_file(filename):
    """使用生成器逐行处理大文件,节省内存"""
    def read_lines():
        with open(filename, 'r', encoding='utf-8') as f:
            for line in f:
                yield line.strip()
    
    # 处理每一行
    for line in read_lines():
        # 进行处理
        pass

# 批量操作优化
def batch_process(data, batch_size=1000):
    """批量处理数据"""
    for i in range(0, len(data), batch_size):
        batch = data[i:i + batch_size]
        # 处理批次
        yield batch

# 使用示例
# for batch in batch_process(large_list):
#     process_batch(batch)

第六部分:学习路径与资源推荐

6.1 从零基础到精通的学习路线

第一阶段:基础语法(1-2周)

  • 掌握变量、数据类型、运算符
  • 熟练使用条件语句和循环
  • 理解函数定义和调用
  • 掌握基本的文件读写操作

第二阶段:数据处理(2-3周)

  • 学习pandas库进行数据分析
  • 掌握CSV、Excel、JSON处理
  • 理解数据清洗和转换
  • 学习基本的数据可视化

第三阶段:自动化脚本(2-3周)

  • 文件系统操作(os, shutil)
  • 定时任务(schedule)
  • 网络请求(requests)
  • 邮件发送(smtplib)

第四阶段:项目实战(持续)

  • 开发完整的自动化系统
  • 学习异常处理和日志记录
  • 掌握代码调试技巧
  • 学习版本控制(Git)

6.2 推荐学习资源

在线教程:

  • Python官方文档(docs.python.org)
  • 菜鸟教程(runoob.com/python)
  • 廖雪峰Python教程

书籍推荐:

  • 《Python编程:从入门到实践》
  • 《利用Python进行数据分析》
  • 《Python自动化运维》

实践平台:

  • Kaggle(数据集和竞赛)
  • GitHub(开源项目学习)
  • LeetCode(编程练习)

6.3 常见问题与解决方案

Q1: 中文编码问题

# 始终指定encoding='utf-8'
with open('file.txt', 'r', encoding='utf-8') as f:
    content = f.read()

Q2: 文件路径问题

import os
# 使用os.path.join跨平台兼容
path = os.path.join('folder', 'subfolder', 'file.txt')

Q3: 依赖库安装失败

# 使用国内镜像源
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

结语

通过本教程的系统学习,你已经掌握了Python编程的核心技能,特别是数据处理和自动化脚本编写方面的实战能力。记住以下关键点:

  1. 实践为王:理论学习必须配合大量实践
  2. 循序渐进:从简单脚本开始,逐步构建复杂系统
  3. 善用工具:学会使用调试器、日志系统等开发工具
  4. 持续学习:Python生态不断发展,保持学习的热情

现在,开始你的Python自动化之旅吧!从一个简单的文件重命名脚本开始,逐步构建属于你自己的自动化工具箱。