一、文件打开和关闭
# 第一种方式/异常退出时文件无法关闭
file = open('test.txt', 'rw')
file.close()
# 第二种方式/使用finally最终执行close()
try:
file = open('test.txt', 'rw')
except FileNotFoundError:
print('文件未找到')
finally:
file.close()
# 第三种方式/使用with....as,当文件执行或者出错时退出,文件最后执行close()
with open('youbian1.txt', 'r', encoding='utf8') as file:
# 执行的方法
pass
二、文件的读写
读写各类的各种方式及对应的功能:
- 单一方法
- r: 以只读方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,则报错。这是默认模式。
- w:打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
- a:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
- rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
- wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
- ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
- 读写方法
- r+:打开一个文件用于读写。文件指针将会放在文件的开头。
- w+:打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
- a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
- rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
- wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
- ab+:以二进制格式打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
整体来说有+号的就是读写,有b的是二进制,r是从头,a是从最后,w是覆盖或创建
读:
import json
you_list = []
with open('youbian1.txt', 'r', encoding='utf8') as file:
while True:
# content = file.read() 读取一个
# 读取一行
content = file.readline().strip(',\n')
# content = file.readlines().strip(',\n') 按行读取所有
if not content:
break
x = json.loads(content)
you_list.append(x)
print(you_list)
写:
# 序列化
import json
you_dict = {
'name':'小李',
'age':18,
'like':'跳舞'
}
# encoding:编码方式,
with open('./test.txt(文件地址)','a(写入方式)',encoding='utf-8') as fp:
# ensure_ascii=False:如果数据中有中文,可以使数据存入文本中后保持中文状态。
fp.write(json.dumps(you_dict,ensure_ascii=False))
上述代码中的readline方法与readlines有区别,当数据可以直接导入用是,可以直接用readlines读取后使用json的反序列化load、loads将字符串改为对象
三、将文件写入内存
Python中提供了StringIO和BytesIO这两个类将字符串数据和二进制数据写入到内存里。
StringIO
from io import StringIO
# 创建一个StringIO对象
f = StringIO()
# 可以像操作文件一下,将字符串写入到内存中
f.write('hello\r\n')
f.write('good')
# 使用文件的 readline和readlines方法,无法读取到数据
# print(f.readline())
# print(f.readlines())
# 需要调用getvalue()方法才能获取到写入到内存中的数据
print(f.getvalue())
f.close()
BytesIO
from io import BytesIO
f = BytesIO()
f.write('你好\r\n'.encode('utf-8'))
f.write('中国'.encode('utf-8'))
print(f.getvalue())
f.close()
BytesIO使用二进制存入内存
四、文件的拷贝
# 提示输入文件
file_name = input("请输入要拷贝的文件名字:")
# 以读的方式打开文件
old_file = open(file_name, 'rb')
# 分割文件名和后缀名
file_names =file_name.rsplit('.', maxsplit=1)
# 组织新的文件名字
new_file_name = file_names[0] + '.bak.'+file_names[1]
# 创建新文件
newFile = open(new_file_name, 'wb')
# 把旧文件中的数据,一行一行的进行复制到新文件中
for lineContent in old_file.readlines():
newFile.write(lineContent)
# 关闭文件
old_file.close()
newFile.close()
后续拓展,上面的需要更详细,可以再加个csv文件操作…