码迷,mamicode.com
首页 > 编程语言 > 详细

【python】文件的读写方法(r;r+;rb;w;w+;wb;a;a+;ab)

时间:2021-06-07 21:09:28      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:文件内容   就会   lazy   报错   trunc   文本文件   encoding   date   系统默认   

一、打开文件

open(path,flag,encoding,[errors])

  • path:打开路径
  • flag:打开方式:【读r(read),写w(write),追加a(append)】
  • encoding:编码方式
  • errors:错误处理

二、详解:读(read),写(write),追加(append) 区别

r:只读。该文件必须已存在。
r+:可读可写。该文件必须已存在,写为追加在文件内容末尾。
rb:表示以二进制方式读取文件。该文件必须已存在。
w:只写。打开即默认创建一个新文件,如果文件已存在,则覆盖写(即文件内原始数据会被新写入的数据清空覆盖)。
w+:写读。打开创建新文件并写入数据,如果文件已存在,则覆盖写。
wb:表示以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,则覆盖写。
a:追加写。若打开的是已有文件则直接对已有文件操作,若打开文件不存在则创建新文件,只能执行写(追加在后面),不能读。
a+:追加读写。打开文件方式与写入方式和‘a‘一样,但是可以读。需注意的是你若刚用‘a+’打开一个文件,一般不能直接读取,因为此时光标已经是文件末尾,除非你把光标移动到初始位置或任意非末尾的位置。(注:可使用seek() 方法解决这个问题)

三、实例

  • 1: r ---只读模式
    注意:test2.txt 必须文件是已存在的。顺便说一下字符编码。因为Windows操作系统默认字符编码为GBK,而Python默认Unicode.utf-8,如果不写“ encoding=‘utf-8‘ "就会报错。
    技术图片

  • 2: r+ ---可读可写模式
    技术图片

  • 3: rb ---以二进制方式读取文件
    技术图片

  • 4: w ---只写模式
    技术图片

  • 5: w+ ---写读模式
    技术图片

  • 6: wb+ ---以二进制方式读写文件
    技术图片

  • 7: a ---追加写模式
    技术图片

  • 8: a+ ---追加读写模式
    技术图片

四、拓展

方法 含义
print(f.readline()) # 打印一行
print(f.readline(5)) # 打印前5个字符
print(f.tell()) # 打印当前指针位置
print(f.read()) # 读完文件后,指针在最尾处
f.seek(0) # 如要重头到尾再读,文件指针须先回到文件头(0-文件头,默认值; 1-当前位置; 2-文件尾)
print(f.read()) # 重读文件
print(f.encoding) # 打印当前使用的字符编码
print(f.name) # 打印文件名
print(f.flush()) # 刷新
f.truncate() # 清空文件
f.truncate(12) # 从头开始,第12个字符后截断并清除
f.close() # 关闭文件

五、面试题:

题目:文本文件id-name.txt中以如下格式保存了学号和姓名信息,其中学号是唯一的,不会重复,学号的顺序无所谓。
123,yang
1234,dong
……
现在来了一名新生,学号为654321,姓名为王五,请用python代码添加把新学生添加进txt文件名单。
如果该学生已经存在,则用“王五”代替当前学号的姓名,学生人数不多,不用考虑代码的执行效率。
追加问题:如果考虑代码执行效率?该怎么设计?

# 1. 读取文件内容
with open("./tihuan.txt", "r") as f:
    f_r = f.read()
    old_content = f_r.split("\n")
    old_content2 = [item.split(",") for item in old_content]

# 2. 获取新内容,将新内容切割得到id和date
new_content = input("请输入新内容:")
new_id = new_content.split(",")[0]
new_data = new_content.split(",")[1]

# 3.判断是否和文件中内容的ID重复,记录重复ID在old_content2的下表索引值 添加到列表中, 计算重复总数count
replace_index = []
count = 0
for i in old_content2:
    if len(replace_index) <= len(old_content2):
        if new_id == i[0]:
            replace_index.append(count)
        count+=1

# 4. 根据记录的重复索引下表列表长度 判断是 执行替换还是 追加操作
if len(replace_index) == 0:
    print("没有重复内容,将新内容追加到文件末尾")
    with open("./tihuan.txt", "a") as f_a:
        f_a.write(new_content)
        f_a.close()
else:
    print("文件中有{}个相同内容".format(len(replace_index)))
    for i in replace_index:
        old_content2[i][1] = new_data

    # 5. 新内容字符串拼接
    str_data = ""
    for i in old_content2:
        str_data += i[0] + "," + i[1] + "\n"

    # 6. 将新内容写入文件
    with open("./tihuan.txt", "w") as f_w:
        f_w.write(str_data)
        f_w.close()

【python】文件的读写方法(r;r+;rb;w;w+;wb;a;a+;ab)

标签:文件内容   就会   lazy   报错   trunc   文本文件   encoding   date   系统默认   

原文地址:https://www.cnblogs.com/jianxiaochong/p/14859714.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!