1. 从“Hello, World!”到能写点东西:一个老码农的Python入门心法
“全网最详细”这个标题,我第一眼看到时,心里是有点嘀咕的。详细到什么程度?是把官方文档再抄一遍,还是把每个标点符号都解释一遍?作为一个写了十几年代码,从C++、Java一路摸爬滚打到Python的老家伙,我深知“入门”这两个字的分量。它不应该是一本厚重的、让人望而生畏的词典,而应该是一张清晰的地图,告诉你从脚下这片名为“零基础”的荒地出发,第一步踩在哪里最稳,走哪条路风景最好、坑最少,以及走到哪里你才算真正“入了门”,能自己动手捣鼓点有意思的东西。
所以,这篇东西,我不想做成教科书。我想把它做成一份“老司机带路”的笔记,聊聊我当年是怎么绕开那些看似高大上实则没用的知识点,直接抓住Python的七寸,快速上手的。我们会从那个经典的“Hello, World!”开始,但绝不止步于此。我会告诉你,为什么Python的语法看起来这么“随意”,这种“随意”背后藏着怎样的设计哲学和效率提升;我会带你亲手搭建环境,不是草草了事,而是理解每一个选择背后的原因,避开那些新手一装就崩的坑;我们会把那些最核心、每天都会用到的概念——变量、数据类型、条件循环、函数——掰开了揉碎了讲,但重点不是背概念,而是理解“什么时候用”以及“为什么这么用”。
最终的目标很简单:看完这篇长文,你不仅能看懂基本的Python代码,更能自己写出几十行、上百行解决一个实际小问题的脚本,比如自动整理电脑上的文件、批量处理Excel表格、或者从网页上抓点你需要的数据。这才是“入门”该有的样子:有成就感,有继续学下去的动力。好了,废话不多说,我们上路。
2. 磨刀不误砍柴工:搭建一个“不闹心”的Python开发环境
几乎所有教程都会让你去官网下载Python安装包,然后一路Next。这没错,但对于想认真学的人来说,这仅仅是开始,甚至可能是“噩梦”的开始。为什么?因为你很快会遇到“我电脑上怎么有好几个Python版本?”、“pip install 怎么总是报错?”、“代码写好了,该用哪个图标打开?”这些让人抓狂的问题。我们得从根儿上把环境理顺。
2.1 Python解释器:选对版本,避开初代“天坑”
访问Python官网,你会看到两个主要版本:Python 3.x 和 Python 2.x。
请你毫不犹豫地选择Python 3的最新稳定版(比如写作时的3.11, 3.12)
。Python 2在2020年就已经彻底停止维护,任何新项目、新学习都绝不应该再碰它。网络上一些很老的教程或代码可能是Python 2的,遇到语法差异(比如
print
语句不带括号),你需要知道那是过时的东西。
安装时,请务必勾选
“Add Python to PATH”
这个选项。这是最关键的一步!PATH是系统寻找可执行文件的路径列表。勾选它,意味着你可以在命令行(cmd或终端)的任何位置,直接输入
python
或
pip
来启动解释器或包管理工具。如果不勾选,你就得手动去Python的安装目录下找这些程序,非常麻烦。很多新手卡在第一步,就是因为没勾这个选项。
安装完成后,验证一下。打开你的命令行(Windows上是
cmd
或
PowerShell
,Mac/Linux上是
Terminal
),输入:
python --version
如果正确显示了你安装的版本号(如
Python 3.11.4
),那么恭喜你,第一步成功了。如果提示“不是内部或外部命令”,那大概率就是PATH没配置好,需要去系统环境变量里手动添加Python的安装路径。
2.2 代码编辑器:别用记事本,选你的“趁手兵器”
写Python代码,千万别用Windows自带的记事本。它不会对代码进行高亮显示,而且默认保存的编码格式可能导致中文乱码。我们需要一个专业的代码编辑器或集成开发环境(IDE)。
- 新手极简之选:VS Code 。这是我目前最推荐给新手的工具。它轻量、免费、插件生态极其丰富。安装后,只需要安装官方的“Python”插件,就能获得代码高亮、智能提示(IntelliSense)、语法检查、调试等几乎所有IDE的功能。它的学习曲线平缓,界面现代,足以陪伴你从入门到进阶。
- 专业一站式之选:PyCharm 。这是JetBrains公司出品的专业Python IDE,分免费的社区版和收费的专业版。社区版对初学者来说功能已经绰绰有余。它的开箱即用性更好,项目管理、代码重构、版本控制(Git)集成等功能都非常强大。如果你打算未来从事Python开发,PyCharm是行业标准工具之一。
- 轻量快速之选:Sublime Text / Vim / Emacs 。这些是更偏向编辑器的选择,需要一定的配置才能达到好用的状态,适合喜欢折腾、追求效率的老手。
对于纯新手,我建议从 VS Code 开始。安装简单,遇到问题网上解决方案也多。
2.3 包管理工具pip与虚拟环境:让项目之间“井水不犯河水”
Python强大的原因之一是有海量的第三方库(包),比如用来做数学计算的
numpy
,用来做数据分析的
pandas
。安装这些库的工具就是
pip
,它通常随Python一起安装。
在命令行里,你可以用
pip install 包名
来安装包。例如,安装一个用于发送HTTP请求的著名库
requests
:
pip install requests
但这里有一个至关重要的概念:
虚拟环境(Virtual Environment)
。想象一下,你项目A需要
requests
的2.25版本,项目B需要
requests
的3.0版本。如果你把所有包都直接安装在电脑的全局Python环境里,版本冲突就会发生,导致其中一个项目无法运行。
虚拟环境就是为每个项目创建一个独立的、干净的Python运行环境,包含独立的解释器和包目录。这样,项目之间的依赖就完全隔离了。
创建和使用虚拟环境(以命令行操作为例):
-
进入你的项目目录:
cd path/to/your_project -
创建虚拟环境:
python -m venv venv。这个命令会在当前目录下创建一个名为venv的文件夹,里面就是独立的Python环境。 -
激活虚拟环境:
-
Windows (cmd):
venv\Scripts\activate -
Windows (PowerShell):
venv\Scripts\Activate.ps1(可能需要先执行Set-ExecutionPolicy RemoteSigned允许脚本运行) -
Mac/Linux:
source venv/bin/activate激活后,命令行提示符前面通常会显示(venv),表示你当前正在这个虚拟环境中工作。
-
Windows (cmd):
-
在激活的环境下,使用
pip install安装的包,只会安装到当前项目的venv目录下,不会影响全局。 -
工作完成后,输入
deactivate命令即可退出虚拟环境。
注意 :养成 每个新项目都先创建独立虚拟环境 的习惯,是走向专业开发的第一步。它能帮你避开未来无数依赖冲突的坑。VS Code和PyCharm都提供了非常便捷的图形化界面来创建和管理虚拟环境。
3. Python语法初体验:为什么说它是“最像伪代码的语言”
环境搭好了,我们终于可以开始写代码了。Python以其语法简洁、可读性强著称,常被形容为“可执行的伪代码”。我们通过几个核心概念来感受一下。
3.1 变量与基本数据类型:给数据贴个标签
在Python里,创建一个变量简单到不可思议,你不需要声明它的类型(这叫做“动态类型”)。
name = "张三" # 这是一个字符串(str),用单引号或双引号包裹
age = 25 # 这是一个整数(int)
height = 1.75 # 这是一个浮点数(float),即小数
is_student = True # 这是一个布尔值(bool),只有True或False
你可以直接使用
type()
函数查看任何变量的类型:
print(type(age)) # 输出:<class 'int'>
。
字符串 是你会频繁打交道的类型。它有很多实用的方法:
text = "hello, world!"
print(text.upper()) # 转大写: HELLO, WORLD!
print(text.capitalize()) # 首字母大写: Hello, world!
print(text.split(",")) # 按逗号分割: ['hello', ' world!']
print(f"My name is {name}, age is {age}") # f-string格式化,非常方便!
3.2 列表、元组、字典、集合:把数据装进不同的“容器”
单个变量不够用,我们需要能存储多个数据的结构。
-
列表(list)
:有序、可变的集合。用方括号
[]表示。fruits = ["apple", "banana", "cherry"] fruits.append("orange") # 添加元素 fruits[1] = "blueberry" # 修改第二个元素(索引从0开始) print(fruits[0]) # 访问第一个元素: apple -
元组(tuple)
:有序、
不可变
的集合。用圆括号
()表示。不可变意味着创建后不能修改,这使得它在作为字典的键或函数参数时更安全。coordinates = (10, 20) # coordinates[0] = 5 # 这行会报错!元组不可修改 -
字典(dict)
:无序的键值对集合。用花括号
{}表示,键值之间用冒号:分隔。它像一本字典,通过“键”能快速找到对应的“值”。person = {"name": "李四", "age": 30, "city": "北京"} print(person["name"]) # 获取键为"name"的值: 李四 person["job"] = "Engineer" # 添加新的键值对 -
集合(set)
:无序、不重复元素的集合。用花括号
{}表示(但内部不是键值对)。主要用于成员关系测试和去重。unique_numbers = {1, 2, 2, 3, 4} print(unique_numbers) # 输出: {1, 2, 3, 4},自动去重了
3.3 程序的控制流:让代码学会“判断”和“重复”
代码不能只从上到下执行,需要根据条件走不同的分支,或者重复执行某些操作。
条件判断(if-elif-else) :
score = 85
if score >= 90:
grade = "A"
elif score >= 80: # else if 的缩写
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "D"
print(f"得分{score},等级为{grade}")
Python使用缩进(通常是4个空格)来定义代码块,这是语法的一部分,而不仅仅是美观。
if
、
elif
、
else
后面的冒号
:
和缩进是固定格式。
循环(for & while) :
-
for循环:常用于遍历一个序列(如列表、字符串)。for fruit in ["apple", "banana", "cherry"]: print(f"I like {fruit}") # 配合range()函数进行指定次数的循环 for i in range(5): # range(5)生成0,1,2,3,4 print(i) -
while循环:当给定条件为真时,重复执行代码块。count = 0 while count < 5: print(count) count += 1 # 等价于 count = count + 1,千万别忘了改变条件,否则会死循环!break语句可以立即退出当前循环,continue语句可以跳过当前循环的剩余语句,直接进入下一轮循环。
4. 函数:将代码块打包,实现“一次编写,多次调用”
当一段代码需要被重复使用时,就该把它封装成函数了。函数是组织代码、实现复用的基本单元。
4.1 定义与调用:最基本的抽象
def greet(name): # def 关键字定义函数,`name`是参数
"""这是一个简单的问候函数(这里是文档字符串,说明函数用途)"""
return f"Hello, {name}!" # return 语句返回结果
# 调用函数
message = greet("Alice")
print(message) # 输出: Hello, Alice!
4.2 参数传递的奥秘:位置参数、默认参数与可变参数
-
位置参数
:调用时按顺序传递。
def describe_pet(animal_type, pet_name): print(f"I have a {animal_type} named {pet_name}.") describe_pet('hamster', 'Harry') # 顺序对应 -
关键字参数
:调用时指定参数名,可以不按顺序。
describe_pet(pet_name='Harry', animal_type='hamster') # 效果同上 -
默认参数
:定义时为参数指定默认值,调用时可省略。
def describe_pet(pet_name, animal_type='dog'): # animal_type 默认为 'dog' print(f"I have a {animal_type} named {pet_name}.") describe_pet('Willie') # 输出: I have a dog named Willie.注意 :默认参数必须指向不变对象(如
None, 数字,字符串,元组)。如果指向可变对象(如列表、字典),可能会掉进一个经典的坑里,因为默认值在函数定义时就被计算并记住了,后续调用如果修改了它,会影响所有使用默认值的调用。# 错误示范 def add_item(item, my_list=[]): my_list.append(item) return my_list print(add_item('a')) # 输出: ['a'] print(add_item('b')) # 你以为输出['b'],实际输出: ['a', 'b'] !!! # 正确做法:使用None作为默认值 def add_item(item, my_list=None): if my_list is None: my_list = [] my_list.append(item) return my_list -
可变参数
:
*args接收任意数量的位置参数,打包成一个元组;**kwargs接收任意数量的关键字参数,打包成一个字典。def make_profile(first, last, **user_info): profile = {} profile['first_name'] = first profile['last_name'] = last for key, value in user_info.items(): profile[key] = value return profile user = make_profile('Albert', 'Einstein', location='Princeton', field='Physics') print(user) # 输出包含额外信息的字典
4.3 作用域:变量在哪里“生效”?
理解作用域能避免很多莫名其妙的错误。简单来说:
- 局部变量 :在函数内部定义的变量,只在函数内部有效。
- 全局变量 :在函数外部定义的变量,在整个程序文件中都有效。
-
规则
:函数内部可以读取全局变量的值,但
不能直接修改
(对于不可变类型如数字、字符串,修改操作会创建一个新的局部变量;对于可变类型如列表,修改其内容是可以的)。若要在函数内部修改全局变量,需要使用
global关键字声明(通常不建议频繁使用,会降低代码可读性和可维护性)。count = 0 # 全局变量 def increment(): global count # 声明要修改全局变量count count += 1 increment() print(count) # 输出: 1
5. 面向对象编程(OOP)初窥:用“对象”思维建模世界
面向对象是Python乃至现代编程的核心范式。它把数据和操作数据的方法封装在一起,形成一个“对象”。这更符合我们对现实世界的认知。
5.1 类与对象:蓝图与实物
- 类(Class) :是对象的蓝图或模板。它定义了一类对象共有的属性(数据)和方法(函数)。
- 对象(Object/Instance) :是根据类创建出来的具体实体。
class Dog:
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age。self是必须的,指向实例本身。"""
self.name = name # 实例属性
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(f"{self.name} is now sitting.")
def roll_over(self):
"""模拟小狗打滚"""
print(f"{self.name} rolled over!")
# 根据Dog类创建实例(对象)
my_dog = Dog('Willie', 6) # __init__方法被调用
print(f"My dog's name is {my_dog.name}.") # 访问属性
my_dog.sit() # 调用方法
my_dog.roll_over()
__init__
是一个特殊方法(构造方法),在创建新实例时自动运行。
self
参数是对实例自身的引用,让你能访问实例的属性和其他方法。
5.2 继承:代码复用的利器
一个类可以继承另一个类的属性和方法。被继承的类叫 父类(基类) ,继承的类叫 子类(派生类) 。
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 # 新增一个属性,默认值为0
def get_descriptive_name(self):
long_name = f"{self.year} {self.make} {self.model}"
return long_name
def read_odometer(self):
print(f"This car has {self.odometer_reading} miles on it.")
class ElectricCar(Car): # 继承Car类
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year) # super()调用父类的方法
self.battery_size = 75 # 电动汽车特有的属性
def describe_battery(self):
"""打印电瓶容量"""
print(f"This car has a {self.battery_size}-kWh battery.")
my_tesla = ElectricCar('tesla', 'model s', 2023)
print(my_tesla.get_descriptive_name()) # 调用继承来的方法
my_tesla.describe_battery() # 调用子类自己的方法
子类可以重写父类的方法,也可以定义自己新的属性和方法。
super()
函数让你能调用父类的方法,这在初始化时非常有用。
6. 文件操作与异常处理:让程序更健壮,能与外界交互
程序不能只活在内存里,需要从文件读取数据,或者把结果保存下来。同时,程序运行中总会遇到各种意外(文件找不到、网络错误、用户输入非法数据等),我们需要优雅地处理它们,而不是让程序直接崩溃。
6.1 读写文件:与磁盘打交道
Python使用
open()
函数打开文件,返回一个文件对象。
# 写入文件
with open('example.txt', 'w', encoding='utf-8') as file: # 'w'表示写入模式,会覆盖原有内容
file.write("Hello, Python!\n")
file.write("这是第二行。")
# 使用`with`关键字可以确保文件在使用后被正确关闭,即使发生异常。这是最佳实践。
# 读取整个文件
with open('example.txt', 'r', encoding='utf-8') as file: # 'r'表示读取模式
contents = file.read()
print(contents)
# 逐行读取
with open('example.txt', 'r', encoding='utf-8') as file:
for line in file: # 文件对象是可迭代的
print(line.strip()) # strip()去除每行末尾的换行符
# 读取所有行到一个列表
with open('example.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
print(line.strip())
常见的文件打开模式:
-
'r':只读(默认)。 -
'w':写入,会覆盖已有文件。 -
'a':追加,在文件末尾添加内容。 -
'r+':读写。 -
'b':二进制模式,例如'rb'或'wb',用于处理图片、视频等非文本文件。
注意 :处理文本文件时,务必指定正确的
encoding(如'utf-8'),否则可能遇到乱码问题。这是中文环境下非常常见的坑。
6.2 异常处理:预见并优雅地处理错误
异常是Python在运行时检测到的错误。使用
try-except
代码块可以捕获并处理异常,防止程序意外终止。
try:
# 尝试执行的代码
number = int(input("请输入一个数字: "))
result = 10 / number
print(f"10除以{number}的结果是:{result}")
except ValueError:
# 如果用户输入的不是数字,int()会引发ValueError
print("错误:您输入的不是一个有效的整数!")
except ZeroDivisionError:
# 如果用户输入0,除法会引发ZeroDivisionError
print("错误:除数不能为零!")
except Exception as e:
# 捕获所有其他未预见的异常
print(f"发生未知错误:{e}")
else:
# 如果没有发生任何异常,则执行else块
print("计算成功完成!")
finally:
# 无论是否发生异常,finally块中的代码都会执行,常用于清理资源(如关闭文件)
print("程序执行结束。")
良好的异常处理能让你的程序更健壮、用户体验更好。不要简单地用一个
except Exception
捕获所有错误,而应该尽可能具体地捕获你知道可能发生的异常类型。
7. 常用内置模块与标准库:站在巨人的肩膀上
Python“内置电池”的哲学意味着它自带了许多功能强大的模块,无需安装即可使用。掌握它们能极大提升效率。
7.1 os与sys:与操作系统交互
-
os模块:提供了许多与操作系统交互的函数。import os print(os.getcwd()) # 获取当前工作目录 os.makedirs('new_folder/sub_folder', exist_ok=True) # 创建目录(包括中间目录) file_list = os.listdir('.') # 列出当前目录下的文件和文件夹 -
sys模块:提供了与Python解释器紧密相关的变量和函数。import sys print(sys.version) # Python解释器版本信息 print(sys.argv) # 命令行参数列表 # sys.exit(0) # 退出程序
7.2 datetime与time:处理日期和时间
from datetime import datetime, timedelta
now = datetime.now()
print(f"当前时间:{now}")
print(f"年-月-日:{now.strftime('%Y-%m-%d')}") # 格式化输出
print(f"时:分:秒:{now.strftime('%H:%M:%S')}")
# 时间计算
one_day = timedelta(days=1)
yesterday = now - one_day
print(f"昨天是:{yesterday.strftime('%Y-%m-%d')}")
7.3 json:处理JSON数据
JSON是网络数据传输和配置文件最常用的格式之一。
import json
# 将Python对象(字典、列表等)转换为JSON字符串
data = {
"name": "张三",
"age": 30,
"city": "北京"
}
json_string = json.dumps(data, ensure_ascii=False, indent=2) # ensure_ascii=False确保中文正常显示,indent美化格式
print(json_string)
# 将JSON字符串解析为Python对象
parsed_data = json.loads(json_string)
print(parsed_data["name"])
# 读写JSON文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
with open('data.json', 'r', encoding='utf-8') as f:
loaded_data = json.load(f)
7.4 random:生成随机数
import random
print(random.random()) # 生成一个[0.0, 1.0)之间的随机浮点数
print(random.randint(1, 10)) # 生成一个[1, 10]之间的随机整数
print(random.choice(['apple', 'banana', 'cherry'])) # 从序列中随机选择一个元素
random.shuffle(['apple', 'banana', 'cherry']) # 将序列随机打乱
8. 实战:用Python解决几个真实的小问题
学了这么多,我们来点实际的。下面几个小项目,能让你立刻感受到Python的威力。
8.1 项目一:批量重命名文件
场景:你有一个文件夹,里面有很多类似
photo1.jpg
,
photo2.jpg
...的文件,你想把它们统一重命名为
vacation_001.jpg
,
vacation_002.jpg
...的格式。
import os
def batch_rename(folder_path, prefix, start_num=1):
"""
批量重命名指定文件夹下的文件。
:param folder_path: 文件夹路径
:param prefix: 新文件名的前缀
:param start_num: 起始编号
"""
# 确保文件夹存在
if not os.path.isdir(folder_path):
print(f"错误:路径 '{folder_path}' 不是一个有效的文件夹。")
return
# 获取文件夹内所有文件(排除子文件夹)
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
files.sort() # 可选:按文件名排序
for index, filename in enumerate(files, start=start_num):
# 分离文件名和扩展名
name_part, extension = os.path.splitext(filename)
# 构建新文件名,如 vacation_001.jpg
new_name = f"{prefix}_{index:03d}{extension}" # :03d表示用0填充到3位
# 构建完整的旧路径和新路径
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, new_name)
# 执行重命名
try:
os.rename(old_path, new_path)
print(f"重命名: {filename} -> {new_name}")
except OSError as e:
print(f"重命名 {filename} 失败: {e}")
# 使用示例:将桌面上的'photos'文件夹内文件重命名
batch_rename(r'C:\Users\YourName\Desktop\photos', 'vacation')
注意 :文件操作具有破坏性,运行前建议先在小样本或备份数据上测试。
os.rename如果目标文件已存在会覆盖,更安全的做法可以先检查os.path.exists(new_path)。
8.2 项目二:简易网页内容抓取(使用requests和BeautifulSoup)
场景:你想快速抓取某个新闻网站首页的标题列表。 首先,需要安装两个第三方库:
pip install requests beautifulsoup4
然后编写脚本:
import requests
from bs4 import BeautifulSoup
def fetch_news_titles(url):
"""
从给定的URL抓取新闻标题(假设标题在<h2>标签内,且class为'news-title')。
实际使用时需要根据目标网站的HTML结构调整选择器。
"""
try:
# 发送HTTP GET请求
response = requests.get(url, timeout=5) # 设置超时时间
response.raise_for_status() # 如果状态码不是200,抛出HTTPError异常
response.encoding = response.apparent_encoding # 自动识别编码
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 假设新闻标题是<h2 class="news-title">里的内容
# 你需要用浏览器的开发者工具(F12)查看实际网页结构来调整这个选择器
title_tags = soup.find_all('h2', class_='news-title')
titles = []
for tag in title_tags:
title_text = tag.get_text().strip() # 获取标签内的文本并去除首尾空格
if title_text: # 过滤空标题
titles.append(title_text)
return titles
except requests.exceptions.RequestException as e:
print(f"网络请求出错: {e}")
return []
except Exception as e:
print(f"解析过程出错: {e}")
return []
# 使用示例(请替换为实际可访问且允许抓取的网址)
if __name__ == '__main__':
# 示例网址,请勿用于非法或未经授权的抓取
sample_url = 'https://www.example-news-site.com'
news_titles = fetch_news_titles(sample_url)
if news_titles:
print(f"抓取到 {len(news_titles)} 条新闻标题:")
for i, title in enumerate(news_titles, 1):
print(f"{i}. {title}")
else:
print("未抓取到任何标题。")
重要提示 :网络爬虫应遵守网站的
robots.txt协议,尊重版权,不对目标网站造成过大访问压力。此示例仅用于学习HTML解析技术。
8.3 项目三:处理Excel表格(使用openpyxl)
场景:你有一个员工信息的Excel文件(
employees.xlsx
),需要给所有年龄大于30岁的员工工资增加10%。
首先安装库:
pip install openpyxl
from openpyxl import load_workbook
def process_salary(file_path):
"""
读取Excel文件,为年龄>30的员工涨薪10%。
"""
try:
# 加载工作簿和工作表(假设数据在第一个工作表)
wb = load_workbook(filename=file_path)
ws = wb.active
# 假设表头在第一行:A列是姓名,B列是年龄,C列是工资
# 我们跳过表头,从第二行开始处理
for row in ws.iter_rows(min_row=2, values_only=False): # values_only=False 获取Cell对象
name_cell, age_cell, salary_cell = row[0], row[1], row[2] # 根据实际列调整索引
age = age_cell.value
salary = salary_cell.value
# 确保年龄和工资是数字
if isinstance(age, (int, float)) and isinstance(salary, (int, float)):
if age > 30:
new_salary = salary * 1.1
salary_cell.value = new_salary
print(f"{name_cell.value} 涨薪至 {new_salary:.2f}")
else:
print(f"跳过行 {age_cell.row}:年龄或工资数据格式无效。")
# 保存到新文件,避免覆盖原文件
new_file_path = file_path.replace('.xlsx', '_processed.xlsx')
wb.save(new_file_path)
print(f"处理完成,新文件已保存为:{new_file_path}")
except FileNotFoundError:
print(f"错误:未找到文件 '{file_path}'")
except Exception as e:
print(f"处理过程中发生错误: {e}")
# 使用示例
process_salary('employees.xlsx')
这个例子展示了如何用Python自动化处理办公文档,解放双手。
openpyxl
功能非常强大,可以读写、修改、创建Excel文件的所有元素。
走到这里,你已经不是那个只会打印“Hello, World!”的纯新手了。你掌握了Python的核心语法,理解了函数和面向对象的基本思想,学会了处理文件、异常,还动手用几个实用的库解决了真实问题。这份“详细”,我希望不是知识的简单堆砌,而是帮你理清了一条从零到能够独立解决小问题的清晰路径。编程的学习永远是在“学”与“做”之间循环。接下来,最好的建议是: 找一个你感兴趣的小项目,哪怕再简单,动手去做。 在实现它的过程中,你会遇到无数具体的问题,去搜索、去查阅文档、去社区提问,这个过程才是你技能真正增长的阶梯。Python的世界很大,数据分析、Web开发、自动化运维、人工智能……每个方向都有浩瀚的知识等着你。但只要你握紧了这里学到的基础和“动手去做”的心法,任何方向的大门都会为你敞开。

456

被折叠的 条评论
为什么被折叠?



