路径(Path):
- 绝对路径:从根目录开始的完整的目录(C:\\data\\file.txt)
- 相对路径:相对于当前工作目录的路径(如:/data/file.txt)
- 当前工作目录:导入os标准库,通过os.getcwd()获取,用os.chdir()修改
tip:./表示当前目录,../表示上一级目录
打开二进制模式文件对象时:
加'b'后缀(如'rb','wb'),用于图片、音频等非文本文件,此时不要指定encoding
常用的读写方法:
读操作:
read(size = -1): 读取全部(或指定字节/字符数)
readline(): 读取一行(保留换行符)
readlines(): 读取所有行,返回字符串列表
写操作:
write(str): 写入字符串(文本模式)或字节(二进制模式)
writelines(list): 写入字符串列表(不会自动添加换行符,需要自行在字符串中加\\n)
文件指针控制:
tell(): 返回当前指针位置
seek(offset, whence = 0):移动指针。
whence = 0(开头),1(当前),2(末尾)
关闭文件:
with 语句(上下文管理器)
注意:永远记得关闭文件,否则可能会导致数据丢失或资源泄露
推荐做法:使用with语句,它会自动在代码块结束后关闭文件
文件操作常见异常:
FileNotFoundError:文件不存在
PermissionError:权限不足
UnicodeDecodeError:编码不匹配
建议使用try…except捕获并处理
关于CSV文件操作
# abc.csv的内容
name,age,city
张三,25,北京
李四,30,上海
王五,28,广州
赵六,15,湖南
李胜,27,湖南
李明,47,湖北
李框,17,胡建
读操作:
import csv
# reader() 以列表形式读取
with open('abc.csv', mode = 'r', encoding = 'utf-8') as csv.file:
# csv格式的数据转换为python的对象(底层是二维列表)
reader = csv.reader(csvfile) # [[],[],[]]
for row in reader: # 得到一维列表
print(row)
# 运行结果
['name', 'age', 'city']
['张三', '25', '北京']
['李四', '30', '上海']
['王五', '28', '广州']
['赵六', '15', '湖南']
['李胜', '27', '湖南']
['李明', '47', '湖北']
['李框', '17', '胡建']
另一种方法,以字典结果拿出每一组数据显示:
# 读取带表头的csv文件,可以使用 DictReader()转换为字典格式
with open('abc.csv', mode='r', encoding='utf-8') as csvfile:
dicter = csv.DictReader(csvfile)
for row in dicter: # 每行记录是一个字典
print(row['name'], row['age'], row['city'])
#运行结果
张三 25 北京
李四 30 上海
王五 28 广州
赵六 15 湖南
李胜 27 湖南
李明 47 湖北
李框 17 胡建
写入操作:
通过统一的写入方法writer(),根据参数类型不同,决定写一行还是写多行
参数是一维列表时,每次添加一行
参数是二维列表时,一次性添加多行
注意⚠️:第一次写入数据之前,保证csv文件末尾有一个空行
使用newline时,文件末尾会自动保留空行
添加后消除空行,保留最后一个空行
举个例子:
list1 = ['张三',55,'北京'] # 一维列表
list2 = [
['李胜',27,'湖南'],
['李明',47,'湖北'],
['李框',17,'胡建']
] # 二维列表
# 对一维列表进行写入操作
with open("abc.csv", mode='a', encoding='utf-8', newline='') as csvfile:
# 用可操作python数据的读写
writer = csv.writer(csvfile)
writer.writerow(list1)
对二维列表进入写入操作
with open("abc.csv", mode='a', encoding='utf-8', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(list2)
# 一维列表使用newline执行结果:
张三,55,北京
张三,55,北京
张三,55,北京
# 一维列表未使用newline执行结果:
张三,55,北京
张三,55,北京
张三,55,北京
# 二维列表使用newline执行结果(此处为运行两次方便查看):
李胜,27,湖南
李明,47,湖北
李框,17,胡建
李胜,27,湖南
李明,47,湖北
李框,17,胡建
# 二维列表未使用newline执行结果:
李胜,27,湖南
李明,47,湖北
李框,17,胡建
李胜,27,湖南
李明,47,湖北
李框,17,胡建
如果此时abc.csv 指针在文件末尾而非换行,因为使用了newline则新添加的数据会加入到文件末尾并自动换行。后续的写入操作会正常运行。因此当我们进行写入时,需要手动空行。
如果我们想要将abc.csv 中所有年龄超过25保存到list列表时,可以这样操作:
list1 = []
with open('abc.csv', mode='r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
if int(row['age']) >= 25:
list1.append(row['name'])
print(list1)
读取图片到指定文件夹(当前目录的不同文件夹中):
with open('./p1/a.jpg', 'rb') as f, open('./p2/b.jpg', 'wb') as g:
reader = f.read()
writer = g.write(reader)
关于JSON文件操作
此时的stu.json文件内容:
{
"name": "钱七",
"age": 19,
"job": [
"保安",
"小区保安",
"门卫"
],
"phone": "1777777777"
}
读取json文件
通过load可以读取json文件内容:
# 读写json文件
import json as js
with open('stu.json', mode='r', encoding='utf-8') as f:
reader = js.load(f) # 将 JSON的数据格式转换为python数据格式
print(reader['name'])
print(reader['age'])
print(reader['job'][0])
# 运行结果
钱七
19
保安
写入json文件:
使用dump可以写入json文件内容:
data = {
'name': '李明',
'age': 20,
'job': ['老师','教授','辅导员'],
'phone': '123456789'
}
with open('stu.json', mode='w', encoding='utf-8') as f:
# ensure_ascii = False 不使用ASCII解析汉字,保证中文正常显示
# indent=整数, 缩进的字符数(代码换行有缩进,使代码美观)
js.dump(data, f, ensure_ascii=False, indent=4)
#运行结果
{
"name": "李明",
"age": 20,
"job": [
"老师",
"教授",
"辅导员"
],
"phone": "123456789"
}

