想要查看本系列的其他文章请到作者主页中。
学习提示:在有别的编程基础之上,学习Python很简单,只是语法不同,所以有很多新的语法记不住也没关系,不用专门耗时间死记,实战的时候现用现查就行。
下面的介绍中是每个部分最常用的语法,基本能够应付绝大多数的情况,如果希望学习更详细的内容,可以参考每个部分给出的资料链接。
AI闪电战:代码+实战 从Python速通到深度学习|文件操作与第三方库导入总练习
综合练习:数据处理与模块化设计
目标
你需要完成一个小项目,任务是读取本地的一个数据文件(CSV 文件),进行简单的数据处理,然后将处理后的数据通过网络发送到一个服务器。为此,你将:
- 进行文件操作:读取 CSV 文件中的数据。
- 使用第三方库
requests
发送 HTTP 请求。 - 创建并导入自定义模块进行数据处理。
目录结构
project/
│
├── data/
│ └── sample_data.csv # 示例数据文件
│
├── utils/
│ ├── __init__.py # 包初始化文件
│ ├── file_operations.py # 文件操作模块
│ └── data_processing.py # 数据处理模块
│
├── main.py # 主程序
└── requirements.txt # 依赖库
步骤1:创建数据文件
任务1:创建示例数据文件
在 data/
目录下创建一个 CSV 文件 sample_data.csv
,内容如下:
name,age,city
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago
步骤2:实现文件操作模块
任务2:实现文件读取功能
在 utils/file_operations.py
文件中,编写代码实现读取 CSV 文件的功能。你将创建一个函数 read_csv
,它将读取 CSV 文件并返回数据的列表形式。
# utils/file_operations.py
import csv # 导入 Python 内置的 csv 模块,用于处理 CSV 文件
def read_csv(file_path): # 定义一个名为 read_csv 的函数,它接受一个参数 file_path
"""
读取 CSV 文件并返回数据列表
参数:
file_path: CSV 文件的路径 (告诉使用者这个参数是用来指定要读取的 CSV 文件在计算机中的位置)
返回:
数据列表 (说明函数执行完毕后会返回一个包含 CSV 文件数据的列表)
"""
data = [] # 初始化一个空列表,用于存储从 CSV 文件读取的数据
try: # 尝试执行以下代码块,如果在执行过程中出现异常,会执行 except 部分的代码
with open(file_path, mode='r', encoding='utf-8') as file: # 以只读模式('r')打开指定路径的文件,并指定编码为 'utf-8',将文件对象赋值给变量 file
reader = csv.DictReader(file) # 使用 csv 模块的 DictReader 类创建一个读取器对象 reader,它可以将 CSV 的每一行转换为字典
for row in reader: # 遍历 reader 中的每一行(每一行都是一个字典)
data.append(row) # 将每一行(字典)添加到 data 列表中
except FileNotFoundError: # 如果在尝试打开文件时,发现文件不存在,就会捕获到 FileNotFoundError 这个异常
print(f"文件 {file_path} 未找到") # 打印出提示信息,告诉用户指定的文件未找到
return data # 返回存储了 CSV 文件数据的列表 data
步骤3:实现数据处理模块
任务3:处理数据
在 utils/data_processing.py
中,创建一个函数 process_data
,将 age
小于 30 的用户筛选出来。
# utils/data_processing.py
def process_data(data):
"""
处理数据,筛选出年龄小于30的用户
:param data: 原始数据列表
:return: 筛选后的数据列表
"""
return [row for row in data if int(row['age']) < 30]
这是一个列表推导式,用于从一个名为’data’的列表中筛选出符合特定条件的元素,并创建一个新的列表
[row for row in data] # 表示遍历’data’列表中的每一个’row’
if int(row[‘age’]) < 30 # 这是筛选条件,如果’row’中’age’这个键对应的值转换为整数后小于 30
综合起来,整个表达式的作用是:从’data’列表中,筛选出’age’值转换为整数后小于 30 的那些’row’,并将这些符合条件的’row’组成一个新的列表
步骤4:主程序调用模块并发送数据
任务4:编写主程序
在 main.py
中,你将完成以下任务:
- 从
utils.file_operations
模块中导入read_csv
,读取sample_data.csv
。 - 从
utils.data_processing
模块中导入process_data
,处理读取到的数据。 - 使用
requests
第三方库将处理后的数据发送到一个假设的服务器。
# main.py
import requests # 导入 requests 库,用于发送 HTTP 请求
from utils.file_operations import read_csv # 从 'utils' 文件夹中的 'file_operations' 模块导入 'read_csv' 函数
from utils.data_processing import process_data # 从 'utils' 文件夹中的 'data_processing' 模块导入 'process_data' 函数
def send_data_to_server(data): # 定义一个名为'send_data_to_server' 的函数,用于向服务器发送数据
"""
将数据发送到服务器
参数:
data: 要发送的数据
返回:
服务器响应
"""
url = 'https://httpbin.org/post' # 定义服务器的 URL,这里是一个模拟的服务器地址
response = requests.post(url, json=data) # 使用 requests 库的 post 方法向指定 URL 发送包含数据的 POST 请求,并将响应存储在'response' 变量中
return response # 返回服务器的响应
if __name__ == '__main__': # 当这个 Python 脚本被直接运行时,以下代码块会被执行
# 读取 CSV 文件数据
file_path = 'data/sample_data.csv' # 定义要读取的 CSV 文件的路径
data = read_csv(file_path) # 调用 'read_csv' 函数读取指定路径的 CSV 文件,并将数据存储在 'data' 变量中
if data: # 如果成功读取到数据
# 处理数据,筛选年龄小于 30 的用户
filtered_data = process_data(data) # 调用 'process_data' 函数处理 'data' 数据
# 发送数据到服务器并打印服务器响应
response = send_data_to_server(filtered_data) # 调用'send_data_to_server' 函数将处理后的数据发送到服务器,并将响应存储在'response' 变量中
print(f"服务器响应状态码: {response.status_code}") # 打印服务器响应的状态码
print(f"服务器返回内容: {response.json()}") # 打印服务器返回的内容,使用 '.json()' 方法将响应内容解析为 JSON 格式
步骤5:安装第三方库
任务5:使用 requests
库
在 requirements.txt
文件中添加 requests
库的依赖项:
requests==2.26.0
然后运行以下命令来安装该库:
pip install -r requirements.txt
预期输出
当你运行 main.py
时,程序会:
- 读取
sample_data.csv
文件。 - 筛选出年龄小于30岁的用户(Alice 和 Bob)。
- 将筛选后的数据通过 POST 请求发送到服务器,并输出服务器返回的结果。
输出示例:
服务器响应状态码: 200
服务器返回内容: {'json': [{'name': 'Alice', 'age': '30', 'city': 'New York'}, {'name': 'Bob', 'age': '25', 'city': 'Los Angeles'}], ...}
1.
if __name__ == '__main__'
是什么意思?当我们编写 Python 程序时,每个文件都可以被当作一个独立的程序运行,也可以被当作模块导入到其他程序中。而
if __name__ == '__main__'
是用来区分这两种情况的关键部分。通俗点说:
__name__
是 Python 自动创建的一个变量,它记录了当前文件是怎么运行的。
- 如果直接运行这个文件,那么
__name__
的值就是'__main__'
。- 如果这个文件是被作为模块导入的,那么
__name__
就会等于文件的名字(比如my_module
)。 这句话的作用是告诉 Python:- 如果这个文件是直接运行的,就执行
if
下面的代码。- 如果这个文件是被导入的,就不执行
if
下面的代码。举例:
# demo.py def say_hello(): print("Hello!") if __name__ == '__main__': say_hello()
当你直接运行
demo.py
,输出:Hello!
如果你在另一个文件中导入
demo.py
:python import demo
那么什么也不会输出,因为if __name__ == '__main__'
中的代码不会被执行。2. 什么是 JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据格式,它是用来在不同系统之间传递数据的。它的格式和 Python中的字典(
dict
)非常相似,简单、易读,常用于API或网络数据传输。通俗来说,JSON
就是一种特殊的文本,用来表示结构化数据,比如用户信息、商品列表等。它可以在不同编程语言之间传递,比如从服务器获取数据时,通常数据会用
JSON 格式。JSON 示例:
{ "name": "Alice", "age": 25, "city": "New York" }
在 Python 中,可以使用
json
模块把 Python 数据类型(比如字典)和 JSON 字符串互相转换:
json.dumps()
:将 Python 对象转换为 JSON 字符串。json.loads()
:将 JSON 字符串转换为 Python 对象。举例:
# Python 字典 -> JSON 字符串 person = {"name": "Alice", "age": 25, "city": "New York"} person_json = json.dumps(person) print(person_json) # 输出: {"name": "Alice", "age": 25, "city": "New York"} # JSON 字符串 -> Python 字典 person_dict = json.loads(person_json) print(person_dict['name']) # 输出: Alice
总结:
if __name__ == '__main__'
用来判断文件是直接运行还是被导入,如果是直接运行,才会执行特定代码。- JSON 是一种用于传输数据的格式,像 Python 字典一样,可以很容易地与网络数据进行交互。
更详细的学习链接
问题解答
由于本系列是基础教程,所以有任何问题基本上国内免费的AI模型都能回答,有任何疑问或Bug可以寻求以下免费的大模型的解答。
- 豆包:https://www.doubao.com/chat/
- 文心一言:https://yiyan.baidu.com/
- 通义千问:https://tongyi.aliyun.com/qianwen/
- 讯飞星火:https://xinghuo.xfyun.cn/desk
如果觉得有帮助的话,求 关注、收藏、点赞、星星 哦!