Python百战 进阶 2 文件
文本文件和二进制文件
文本文件就是txt文件,记事本直接可以打开
二进制文件得用特殊形式打开,比如音频视频什么的
创建文件对象open()
open(r"路径","打开方式")
路径可使用全程或''来表示当前目录
模式
r 只读
w 文件不存在则创造,存在在重写
a 文件不存在则创造,存在则在末尾追加内容
b 二进制模式
- 读写模式
UTF-8 乱码问题
Windows默认编码是GBK,不是UTF-8
解决方法
f = open(r"b.txt","w",encoding="utf-8")
数据写入
write(a)
writelines(b)
数据关闭
f.close()
文本文件的读取
read
with open("example.txt", "r", encoding="utf-8") as f:
content = f.read() # 读取整个文件
print(content)
f.seek(0) # 重置指针到文件开头
first_5_chars = f.read(5) # 只读取前5个字符
print(first_5_chars)
redaline
with open("example.txt", "r", encoding="utf-8") as f:
line1 = f.readline() # 读取第一行(包括换行符 \n)
line2 = f.readline() # 读取第二行
print(line1, line2)
redalines
with open("example.txt", "r", encoding="utf-8") as f:
lines = f.readlines() # 返回列表,每行是列表的一个元素
print(lines) # 例如:["第一行\n", "第二行\n", "第三行"]
文本形式总示例代码
import os
desktop_path = r"C:\Users\len\Desktop"
file_name = "a.txt"
full_path = os.path.join(desktop_path, file_name) # 更安全的路径拼接方式
travel_data = [
"1. 北京故宫 - 中国最著名的古代建筑群\n",
"2. 巴黎埃菲尔铁塔 - 法国的标志性建筑\n",
"3. 东京迪士尼乐园 - 亚洲最受欢迎的主题公园\n",
"4. 马尔代夫 - 世界顶级海岛度假胜地\n",
"5. 罗马斗兽场 - 古罗马文明的象征\n"
]
with open(full_path, "w", encoding="utf-8") as f:
f.write("=== 世界著名旅游景点推荐 ===\n") # 写入标题
f.writelines(travel_data) # 写入多行数据
f.write("\n欢迎随时咨询旅游信息!") # 写入结尾
print("\n=== 文件内容如下 ===")
with open(full_path, "r", encoding="utf-8") as f:
content = f.read()# way1
print(content)
f.seek(0) # 将文件指针移回开头
print("\n=== 逐行读取 ===")
for line in f:
print(line.strip()) # 去掉每行末尾的换行符
二进制文件的读取和写入
使用pickle序列化
pickle.dump(obj, file) obj 就是要被序列化的对象, file 指的是存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对象
示例代码
with open("data.dat", "wb") as f:
name = "高淇"
age = 34
scores = [90, 80, 70]
resume = {'name': name, 'age': age, 'scores': scores}
pickle.dump(resume, f) # 将字典序列化为二进制并写入文件
with open("data.dat", "rb") as f:
loaded_resume = pickle.load(f) # 读取并还原Python对象
print(loaded_resume)
CSV文件的操作
`"""
CSV 文件操作全指南
涵盖:读取、写入、字典读写、特殊格式处理
"""
import csv
import os
==================== 1. 基础CSV写入 ====================
def basic_csv_write():
"""基础CSV写入操作"""
print("\n=== 基础CSV写入 ===")
# 准备数据
headers = ["姓名", "年龄", "城市", "薪资"]
data = [
["张三", 28, "北京", 15000],
["李四", 32, "上海", 20000],
["王五", 25, "广州", 12000],
["赵六", 40, "深圳", 30000]
]
# 写入CSV文件
csv_path = "employees.csv"
with open(csv_path, "w", newline="", encoding="utf-8-sig") as f: # utf-8-sig解决Excel中文乱码
writer = csv.writer(f)
# 写入表头
writer.writerow(headers)
# 写入多行数据
writer.writerows(data)
print(f"CSV文件已创建: {os.path.abspath(csv_path)}")
==================== 2. 基础CSV读取 ====================
def basic_csv_read():
"""基础CSV读取操作"""
print("\n=== 基础CSV读取 ===")
csv_path = "employees.csv"
with open(csv_path, "r", encoding="utf-8-sig") as f:
reader = csv.reader(f)
# 读取表头
headers = next(reader)
print("表头:", headers)
# 读取数据行
print("\n数据内容:")
for row in reader:
print(row)
==================== 3. 字典方式写入CSV ====================
def dict_csv_write():
"""字典方式写入CSV"""
print("\n=== 字典方式写入CSV ===")
# 准备数据
headers = ["name", "department", "hire_date", "salary"]
employees = [
{"name": "张三", "department": "研发部", "hire_date": "2020-01-15", "salary": 15000},
{"name": "李四", "department": "市场部", "hire_date": "2018-05-20", "salary": 18000},
{"name": "王五", "department": "财务部", "hire_date": "2019-11-03", "salary": 20000}
]
# 写入CSV文件
csv_path = "employees_dict.csv"
with open(csv_path, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=headers)
# 写入表头
writer.writeheader()
# 写入多行数据
writer.writerows(employees)
print(f"字典式CSV文件已创建: {os.path.abspath(csv_path)}")
==================== 4. 字典方式读取CSV ====================
def dict_csv_read():
"""字典方式读取CSV"""
print("\n=== 字典方式读取CSV ===")
csv_path = "employees_dict.csv"
with open(csv_path, "r", encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
# 直接按字段名访问数据
print("\n员工数据:")
for emp in reader:
print(f"{emp['name']} ({emp['department']}) - 入职时间: {emp['hire_date']}, 薪资: {emp['salary']}")
==================== 5. 特殊格式处理 ====================
def special_csv_handling():
"""特殊CSV格式处理"""
print("\n=== 特殊CSV格式处理 ===")
# 情况1: 包含逗号的数据
book_data = [
["书名", "作者", "价格"],
["Python编程", "Guido van Rossum", "99,00"], # 价格包含逗号
["数据结构与算法", "Donald Knuth", "120,50"]
]
# 写入带引号的CSV
with open("books.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f, quoting=csv.QUOTE_MINIMAL) # 仅在必要时加引号
writer.writerows(book_data)
# 情况2: 自定义分隔符
with open("books_pipe.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f, delimiter="|", quoting=csv.QUOTE_ALL) # 使用|分隔,所有字段加引号
writer.writerows(book_data)
# 读取自定义分隔符文件
print("\n管道分隔的CSV文件:")
with open("books_pipe.csv", "r", encoding="utf-8-sig") as f:
reader = csv.reader(f, delimiter="|")
for row in reader:
print(row)
==================== 6. 实际应用示例 ====================
def practical_example():
"""CSV实际应用示例"""
print("\n=== CSV实际应用示例 ===")
# 示例1: 计算平均薪资
total_salary = 0
count = 0
with open("employees.csv", "r", encoding="utf-8-sig") as f:
reader = csv.DictReader(f) # 自动将第一行作为字段名
for row in reader:
total_salary += int(row["薪资"])
count += 1
print(f"员工平均薪资: {total_salary/count:.2f}元")
# 示例2: 数据筛选
print("\n高薪员工(薪资>15000):")
with open("employees.csv", "r", encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for emp in reader:
if int(emp["薪资"]) > 15000:
print(f"{emp['姓名']}: {emp['薪资']}元")
==================== 主程序 ====================
if name == "main":
# 执行所有CSV操作
basic_csv_write()
basic_csv_read()
dict_csv_write()
dict_csv_read()
special_csv_handling()
practical_example()
print("\n=== 所有CSV操作已完成 ===")`
浙公网安备 33010602011771号