注:
- 在打开完文件做完相应的操作的时候一定要关闭文件 .close() 否则会占用内存,除非使用了 with
- 在进行读取操作的时候会读取光标后面的内容,有时候写完内容后想读取内容然而读取出来的内容都是空的,因为此时的光标在最后面,所以我们要改变光标的位置才能读取出来
- 加 b 的操作,一般是操作非文字类的文件 例如:图片
- 如果文件的内容只有一行的时候最好用代码添加,因为用 PyCharm 手动添加文件内容保存的时候软件会在最后面添加换行符
- 文件路径问题: 如果文件路径是当前项目下的,那么在路径开头是不用加 /,否则无法读取文件
文件句柄:通过 open() 方法返回的对象就是文件句柄
文件操作的两种写法
- open('文件路径', mode='打开方式', encoding='编码格式') -> mode: 默认值 r -> 一定要关闭文件 .close() 否则会占用内存
f = open('r-file.txt', mode='r', encoding='utf-8')
# xxxx
f.close()
- with open('文件路径', mode='打开方式', encoding='编码格式'), open('文件路径', mode='打开方式', encoding='编码格式') -> 推荐使用 -> 可以同时操作多个文件,如果要进行 open 代码回车用 \
with open('a-file.txt', mode='r+', encoding='utf-8') as f1, \
open('log.txt', mode='r+', encoding='utf-8') as f2:
print(f1.read())
print(f2.read())
1. 只读
- r
f = open('r-file.txt', mode='r', encoding='utf-8')
r = f.read() # Python 文件操作:只读
f.close()
# mode: 默认值 r
f = open('r-file.txt', encoding='utf-8')
r = f.read() # Python 文件操作:只读
f.close()
# r-file.txt 文件里的内容
Python 文件操作:只读
- rb -> 以 bytes 数据类型读取出来,所以 encoding 也不需要写
f = open('r-file.txt', mode='rb')
rb = f.read() # b'Python \xe6\x96\…………'
f.close()
# r-file.txt 文件里的内容
Python 文件操作:只读
f = open('r-file.txt', mode='rb')
rb = f.read() # b'Python'
f.close()
# r-file.txt 文件里的内容
Python
2. 读写(常用)-> 可以进行读取或写入的操作(写入的操作:如果文件中本来就有内容,然后不执行.read()那么,内容会插入到文本的最前面,如果执行了.read()那么就会插入到内容的最后面)
- r+ -> 在进行读写的操作的时候不能先写再读不然读出来的内容会有误
f = open('r-file.txt', mode='r+', encoding='utf-8')
rb = f.read()
f.write('读写')
f.close()
# r-file.txt 原文件里的内容
Python 文件操作:
# r-file.txt 进行读写后文件里的内容
Python 文件操作:读写
- r+ -> 错误示范 -> 先写再读
f = open('r-file.txt', mode='r+', encoding='utf-8')
f.write('读写')
rb = f.read()
f.close()
# r-file.txt 原文件里的内容
Python 文件操作:
# r-file.txt 进行错误示范先写再读后文件里的内容
文件操作:
- r+b -> 以 bytes 数据类型 读取 或 写入
f = open('r-file.txt', mode='r+b')
r = f.read() # b'Python \xe6\x96\…………'
f.write('以 bytes 类型读取或写入'.encode('utf-8')) # 转换成 bytes 类型再写入
f.close()
# r-file.txt 原文件里的内容
Python 文件操作:
# r-file.txt 进行读写后文件里的内容
Python 文件操作:以 bytes 类型读取或写入
3. 只写 -> 如果没有此文件就会创建文件 -> 当程序重新运行的时候先清空文件里的内容然后再写入
- w
f = open('w-file.txt', mode='w', encoding='utf-8')
f.write('Python 文件操作:只写1' + '\n')
f.write('Python 文件操作:只写2')
f.close()
# w-file.txt 内容
Python 文件操作:只写1
Python 文件操作:只写2
- wb 以 bytes 数据类型 写入
f = open('w-file.txt', mode='wb')
f.write('Python 文件操作:以 bytes 类型写入'.encode('utf-8'))
f.close()
# w-file.txt 内容
Python 文件操作:以 bytes 类型写入
4. 写读 -> 可以进行写入或读取的操作 -> 当程序重新运行的时候先清空文件里的内容然后再写入
- w+
f = open('w-file.txt', mode='w+', encoding='utf-8')
f.write('Python 文件操作:写读1' + '\n')
f.write('Python 文件操作:写读2')
f.seek(0) # 改变光标的位置
r = f.read() # 如果不改变光标的位置读取出来的内容是空的,因为此时的光标在内容的最后面
f.close()
# w-file.txt 内容
Python 文件操作:写读1
Python 文件操作:写读2
- w+b 以 bytes 数据类型写入或读取
f = open('w-file.txt', mode='w+b')
f.write('Python 文件操作:以 bytes 数据类型写入或读取'.encode('utf-8'))
f.seek(0)
r = f.read() # b'Python \xe6\x96\…………'
f.close()
# w-file.txt 内容
Python 文件操作:以 bytes 数据类型写入或读取
5. 追加-> 当程序重新运行的时候不清空文件里的内容,在原内容的起初上追加内容
- a
f = open('a-file.txt', mode='a', encoding='utf-8')
f.write('追加')
f.close()
# a-file.txt 原文件的内容
Python 文件操作:
# a-file.txt 进行追加后的内容
Python 文件操作:追加
- ab -> 以 bytes 数据类型 追加
f = open('a-file.txt', mode='ab')
f.write('以 bytes 类型追加'.encode('utf-8'))
f.close()
# a-file.txt 原文件的内容
Python 文件操作:
# a-file.txt 进行追加后的内容
Python 文件操作:以 bytes 类型追加
6. 追加或读取
- a+
f = open('a-file.txt', mode='a+', encoding='utf-8')
f.write('追加或读取')
f.seek(0)
r = f.read() # Python 文件操作:追加或读取
f.close()
# a-file.txt 原文件的内容
Python 文件操作:
# a-file.txt 进行追加后的内容
Python 文件操作:追加或读取
- a+b -> 以 bytes 数据类型追加或读取
f = open('a-file.txt', mode='a+b')
f.write('以 bytes 数据类型追加或读取'.encode('utf-8'))
f.seek(0)
r = f.read() # b'Python \xe6\x96…………'
f.close()
7. 文件操作的方法 -> 读
- .read(num) -> 读取光标后面的内容 -> num: 读取字符的数量(不填默认全部读取)-> 不推荐使用一次性读取整个文件,如果文件过大会内存溢出,建议使用对read进行传值分次读取文件内容
# log.txt 的内容
Python文件操作的方法
f = open('log.txt', mode='r+', encoding='utf-8')
r = f.read(3)
print(r) # Pyt
r = f.read(3)
print(r) # hon
r = f.read(4)
print(r) # 文件操作
- .readline() -> 读取一行的内容包括换行符 -> 一次只读取一行,占内存小,速度慢
# log.txt 的内容
第一行的内容
第二行的内容
第三行的内容
# 手动获取每一行的内容
f = open('log.txt', mode='r+', encoding='utf-8')
line = f.readline() # 第一行的内容
line2 = f.readline() # 第二行的内容
line3 = f.readline() # 第三行的内容
print(line3)
f.close()
# 循环获取每一行的内容
f = open('log.txt', mode='r+', encoding='utf-8')
line = f.readline()
print(type(line))
while line:
print(line.strip()), # 通过 .strip() 去除换行符
line = f.readline()
f.close()
- .readlines() -> 将每一行的内容包括换行符当成列表中的一个元素,添加到list中,不推荐使用:如果一个文件很大,它就会在内存中创建一块很大的内存空间来存储该文件列表
f = open('log.txt', mode='r+', encoding='utf-8')
lines = f.readlines() # ['第一行的内容\n', '第二行的内容\n', '第三行的内容']
# 清除换行符
for line in lines:
lines[lines.index(line)] = line.strip()
print(lines) # ['第一行的内容', '第二行的内容', '第三行的内容']
- 通过循环文件对象(文件句柄)获取里面的所有内容 -> 推荐使用 因为文件句柄不会像 readlines方法 在内存中占用很多的内存空间,而是每进行一次循环就开始创建一个对象返回给你,在进行下一次循环的时候会把上一次的对象给销毁,而不像 read() 和 readlines() 一次性将数据保存到内存中,这样很容易导致内存溢出
f = open('log',mode='r+',encoding='utf-8')
for line in f:
print(line)
f.close()
# log.txt 的内容
第一行的内容
第二行的内容
第三行的内容
8. 文件操作的方法 -> 写
- .write()
f = open('w-file.txt', mode='w', encoding='utf-8')
f.write('Python3')
f.close()
# w-file.txt 内容
Python3
9. 文件操作的方法 -> 其他
- 删除文件
import os
os.remove('文件路径')
- 修改文件名
import os
os.rename('../文件.txt', '../修改后的名字.txt')
- 获取文件的大小
import os
file_size = os.path.getsize('login.txt') # 4 单位是字节
- .readable() -> 是否可读
# log.txt 的内容
文件操作的方法
f = open('log.txt', mode='r+', encoding='utf-8')
isR = f.readable() # True
f.close()
- .seek(byteNum) -> 设置光标的位置 -> 按照字节数定光标 例:内容为 文件操作的方法 然后把光标定在 作 的后面那么 byteNum 应该为 12 因为在 utf-8 里3个字节代表1个中文并且光标的位置是按照字节数来定的,英文在 utf-8 里1个字节代表1个英文
# log.txt 的内容
文件操作的方法
# 将光标定在 作 的后面
f = open('log.txt', mode='r+', encoding='utf-8')
f.seek(12)
r = f.read() # 的方法
f.close()
- 小练习 只读取 操作 二字
# log.txt 的内容
文件操作的方法
f = open('log.txt', mode='r+', encoding='utf-8')
f.seek(6)
r = f.read(2) # 操作
f.close()
- .tell() -> 获取光标的位置
# log.txt 的内容
文件操作的方法
f = open('log.txt', mode='r+', encoding='utf-8')
f.seek(6)
t = f.tell() # 6
f.close()
- .truncate(byteNum) -> 按字节数截取 -> 将文件中的内容截取成 xxx 只能从第一个开始按字节数截取 和 设置光标的位置中的 byteNum 一样
# 将文件内容截取成 Python文
f = open('log.txt', mode='r+', encoding='utf-8')
f.truncate(9)
# log.txt 的内容
Python文件操作方法
# log.txt 截取后的内容
Python文
10. 修改文件内容 -> 在 Python 中没有提供可直接修改文件内容的方法,只能将修改的内容添加新的文件中,将旧文件删除,再将新文件重命名为旧文件的名字,从而实现修改文件(伪修改)
with open('文件.txt', 'r+', encoding='utf-8') as f1, \
open('文件.bak', 'w', encoding='utf-8') as f2:
for line in f1:
if '内容3' in line:
line = line.replace('内容3', '内容2')
f2.write(line)
import os
os.remove('文件.txt') # 删除文件
os.rename('文件.bak', '文件.txt') # 修改文件名
# 文件.txt
文件内容1
文件内容3
# 文件.bak
文件内容1
文件内容2
11. 登录练习 -> 将用户注册的账号密码保存在文件中,然后在登录的时候取出来判断
- 方法一
username = input('请输入你要注册用户的账号:')
password = input('请输入你要注册用户的密码:')
with open('login.txt', mode='w', encoding='utf-8') as f1:
f1.write('{}\n{}'.format(username, password))
while 1:
username = input('请输入你的账号:')
password = input('请输入你的密码:')
with open('login.txt', mode='r+', encoding='utf-8') as f2:
f_un = f2.readline().strip()
f_pwd = f2.readline().strip()
if f_un == username and f_pwd == password:
print('登录成功')
break
else:
print('账号和密码错误')
- 方法二
username = input('请输入你要注册用户的账号:')
password = input('请输入你要注册用户的密码:')
with open('login.txt', mode='w', encoding='utf-8') as f1:
f1.write('{}\n{}'.format(username, password))
user_list = []
while 1:
username = input('请输入你的账号:')
password = input('请输入你的密码:')
with open('login.txt', mode='r+', encoding='utf-8') as f2:
for line in f2.readlines():
user_list.append(line.strip())
if user_list[0] == username and user_list[1] == password:
print('登录成功')
break
else:
print('账号和密码错误')