1、打开文件open()
1、文件的打开操作(打开模式、编码格式)
内置函数:open()
模式 | 模式名称 | 含义 |
---|---|---|
r | 只读 | 1、文件一定要存在,否则报错 2、默认为只读模式 |
w | 只写 | 1、若文件不存在,自动创建 2、文件所在的目录一定要存在,否则报错 3、会覆盖原有内容 4、只能写入,不能读取 |
a | 追加 | 1. 若文件不存在,会自动创建 2. 文件所在目录一定要存在,否则报错 3. 若文件存在,则直接在文件末尾,继续追加内容 |
rb | 只读 | 二进制的方式读,其他一样。(通常用于打开图片) |
wb | 只写 | 二进制的方式写,其他一样。(通常用于打开图片) |
ab | 追加 | 二进制的方式追加,其他一样。(通常用于打开图片) |
r+ | 可读可写 | 1、文件一定要存在,否则报错 2、写为追加,直接在文件末尾,继续追加内容 |
w+ | 写读 | 打开创建新文件并写入数据,如果文件已存在,则覆盖写。 |
a+ | 追加读写 | 打开文件后光标直接在文件末尾,继续追加内容。但是它区别于a的是可以读,需要打开文件后先把光标移动到初始位置或任意非末尾的位置之后才能开始读取content。(注:可使用seek() 方法解决这个问题) |
2、读文件
本地创建一个文件test.txt,内容如下
明月几时有?把酒问青天。
不知天上宫阙,今夕是何年。
我欲乘风归去,又恐琼楼玉宇,高处不胜寒。
起舞弄清影,何似在人间。
转朱阁,低绮户,照无眠。
不应有恨,何事长向别时圆?
人有悲欢离合,月有阴晴圆缺,此事古难全。
但愿人长久,千里共婵娟。
2.1 readline()
逐行读取,如果文件内容有多行,需要使用循环读取全部内容
path = "../learning/test.txt"
fr = open(path, mode='r', encoding="utf-8")
content = fr.readline()
fr.close()
print(content)
result:只读取了第一行
明月几时有?把酒问青天。
Process finished with exit code 0
2.2 readlines()
读取全部内容,返回的是一个列表,且会把换行符也读取出来,需要对列表中的元素进行处理,去掉换行符。
path = "../learning/test.txt"
fr = open(path, mode='r', encoding="utf-8")
content = fr.readlines() # 是个列表
fr.close()
print(content)
Result:
['明月几时有?把酒问青天。\n', '不知天上宫阙,今夕是何年。\n', '我欲乘风归去,又恐琼楼玉宇,高处不胜寒。\n', '起舞弄清影,何似在人间。\n', '转朱阁,低绮户,照无眠。\n', '不应有恨,何事长向别时圆?\n', '人有悲欢离合,月有阴晴圆缺,此事古难全。\n', '但愿人长久,千里共婵娟。']
Process finished with exit code 0
去掉换行符:
path = "../learning/test.txt"
fr = open(path, mode='r', encoding="utf-8")
content = fr.readlines() # 是个列表
fr.close()
print(content)
new_content = []
for i in range(len(content)):
new_content.append(content[i].replace("\n", ""))
print(new_content)
Result:
['明月几时有?把酒问青天。\n', '不知天上宫阙,今夕是何年。\n', '我欲乘风归去,又恐琼楼玉宇,高处不胜寒。\n', '起舞弄清影,何似在人间。\n', '转朱阁,低绮户,照无眠。\n', '不应有恨,何事长向别时圆?\n', '人有悲欢离合,月有阴晴圆缺,此事古难全。\n', '但愿人长久,千里共婵娟。']
['明月几时有?把酒问青天。', '不知天上宫阙,今夕是何年。', '我欲乘风归去,又恐琼楼玉宇,高处不胜寒。', '起舞弄清影,何似在人间。', '转朱阁,低绮户,照无眠。', '不应有恨,何事长向别时圆?', '人有悲欢离合,月有阴晴圆缺,此事古难全。', '但愿人长久,千里共婵娟。']
Process finished with exit code 0
2.3 read()
读取文件中全部内容,是一个字符串
path = "../learning/test.txt"
fr = open(path, mode='r', encoding="utf-8")
content = fr.read()
fr.close()
print(content)
print(type(content))
Result:
明月几时有?把酒问青天。
不知天上宫阙,今夕是何年。
我欲乘风归去,又恐琼楼玉宇,高处不胜寒。
起舞弄清影,何似在人间。
转朱阁,低绮户,照无眠。
不应有恨,何事长向别时圆?
人有悲欢离合,月有阴晴圆缺,此事古难全。
但愿人长久,千里共婵娟。
<class 'str'>
Process finished with exit code 0
3、写文件write()
代码如下
content = "你好,测试同学"
# 若write.txt不存在,就自动创建
fw = open("write.txt", mode='a', encoding="utf-8")
fw.write(content)
fw.close()
4、文件内容查找操作
# 文本文件
path = "test.txt"
# 要查找的文本
content = "测试"
# 文件的行号
lineNum = 0
# 用来存储查找结果
find_result = {
}
# 打开文本文件
f = open(path, mode="r", encoding="utf-8")
# readlines()读取全部数据
for line in f.readlines():
# 遍历元素,找到该文本,将行号和该行内容存储在dict中
if content in line:
print("第 "+str(lineNum+1)+" 行已找到.")
find_result[str(lineNum+1)] = line
lineNum += 1
# 关闭文件
f.close()
# 如果查询结果不为空,打印结果
if find_result != {
}:
print(find_result)
else:
print(f"没有找到{content}")
Resut:
没有找到测试
Process finished with exit code 0
改为查找文本“有”
# 要查找的文本
content = "有"
Result:
第 1 行已找到.
第 6 行已找到.
第 7 行已找到.
{
'1': '明月几时有?把酒问青天。\n', '6': '不应有恨,何事长向别时圆?\n', '7': '人有悲欢离合,月有阴晴圆缺,此事古难全。\n'}
Process finished with exit code 0
5、删除文件中部分内容
示例:删除文件中的“人”
filepath = "test.txt"
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 0: invalid continuation byte
# 如果编码是utf-8,会报上面的错误,部分中文字符在utf-8中没有,使用gb2312编码就可以解决
fr = open(filepath, mode='r', encoding="gb2312")
old_content = fr.read()
remove_content = "人"
new_content = old_content.replace(remove_content, '')
fw = open(filepath, 'w')
# 删除文件全部内容
fw.truncate(0)
# 写入新内容
fw.write(new_content)
now = time.strftime("%Y_%m_%d_%H_%M_%S")
print(f"{
remove_content}删除成功, {
now}")
fw.close()
Result:
人删除成功, 2023_05_24_14_18_06
Process finished with exit code 0
查看删除之后的文本:人已经全部被删掉了。
明月几时有?把酒问青天。
不知天上宫阙,今夕是何年。
我欲乘风归去,又恐琼楼玉宇,高处不胜寒。
起舞弄清影,何似在间。
转朱阁,低绮户,照无眠。
不应有恨,何事长向别时圆?
有悲欢离合,月有阴晴圆缺,此事古难全。
但愿长久,千里共婵娟。
6、代码封装
import time
def file_readline(filepath, encoding="utf-8"):
fr = open(filepath, mode='r', encoding=encoding)
# 仅读取一行
content = fr.readline()
fr.close()
return content
def file_readlines(filepath, encoding="utf-8"):
fr = open(filepath, mode='r', encoding=encoding)
# 读取所有行,返回列表
content = fr.readlines()
fr.close()
return content
def file_read(filepath, encoding="utf-8"):
fr = open(filepath, mode='r', encoding=encoding)
content = fr.read()
fr.close()
return content
def write_file(filepath, content, model='a'):
fw = open(filepath, mode=model, encoding="utf-8")
fw.write(content)
fw.close()
def delete_content(filepath, remove_content):
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 0: invalid continuation byte
# 如果使用utf-8报上面的错误,就使用gb2312编码
old_content = file_read(filepath, encoding="utf-8")
new_content = old_content.replace(remove_content, '')
write_file(filepath, new_content, model='w')
now = time.strftime("%Y_%m_%d_%H_%M_%S")
print(f"{
remove_content}删除成功, {
now}")
def find_content(filepath, content):
# 文件的行号
lineNum = 0
# 用来存储查找结果
find_result = {
}
# 打开文本文件, readlines()读取全部数据
all_lines = file_readlines(filepath)
for line in all_lines:
# 遍历元素,找到该文本,将行号和该行内容存储在dict中
if content in line:
print("第 " + str(lineNum + 1) + " 行已找到.")
find_result[str(lineNum + 1)] = line
lineNum += 1
# 如果查询结果不为空,打印结果
if find_result != {
}:
return find_result
# else:
# return content_list