08 文件操作

1 .只读(r)

# 路径有两种:
#   1. 相对路径, 相对于你当前程序所在的文件夹.(必须掌握)
#    ../ 返回上一层目录
#    相对的是当前程序所在的文件夹
#   2. 绝对路径. 1.从磁盘根目录寻找. 2.互联网上的一个绝对路路径
f = open("歌姬",mode="r",encoding="utf-8")    #f相当于一个句柄
s = f.read()
f.close()                                      #打开以后记得关闭
print(s)

  只读(rb)

f = open("歌姬",mode="rb")                #读取的内容直接是字节
bs = f.read()                              #b'xe5xa4xa7xe7x9cxbcxe5x93xa5,xe5xa4xa9xe5xa4xa9'
print(bs)
print(bs.decode("utf-8"))                 #需要解码
f.close()

2. 只写(w):写的时候注意. 如果没有文件. 则会创建文件, 如果文件存在. 则将原件中原来的内容删除, 再 写入新内容.

f = open("宿舍",mode="w",encoding="utf-8")            #写入之前会清掉原来的内容
f.write("小白梨")
f.flush()
f.close()

  只写(wb)

f = open("歌姬",mode="wb")              #读取的内容直接是字节
f.write("你不好吃".encode("utf-8"))
f.close()

3. 追加(a): 在追加模式下. 我们写入的内容会追加在文件的结尾.

f = open("歌姬",mode="a",encoding="utf-8")            #在原来的基础上追加内容
f.write("小龙女")
f.flush()
f.close()

4读写(r+): 先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常用.

f = open("梨",mode="r+",encoding="utf-8")     #r+模式,默认情况下光标在文件的开头,必须先读后写
s = f.read()
f.write("周润发")
f.flush()
f.close()
print(s)

 在读写模式下,如果没有进行任何操作,直接写入,在开头写入.;只要进行读操作,在末尾处添加写的内容

f = open("梨", mode="r+", encoding="utf-8")
s = f.read(3)
print(s)
# 不管你前面读了几个. 后面去写都是在末尾
f.write("哈哈")   # 1.在没有任何操作之前进行写. 在开头写  2. 如果读取了一些内容. 再写, 写入的是最后

5.写读(w+)

f = open("梨",mode="w+",encoding="utf-8")          #w操作会清空原来的内容.w+是不用的
f.write("今天天气")
f.seek(0)
s = f.read()
print(s)
f.flush()
f.close()

6. 追加读(a+):a+模式下,不论是先读还是后读,都是读不到数据的.

f = open("梨",mode="a+",encoding="utf-8")
f.write("黄鹂")
s = f.read()
print(s)
f.flush()
f.close()

7 .光标移动

f = open("精品", mode="r+", encoding="utf-8")
f.read(3)
f.seek(3)   # 移动到xx位置
移动到开头: f.seek(0)  开头
移动到末尾: f.seek(0, 2)   末尾 第二个参数有三个值. 0: 再开头,  1: 在当前, 2: 末尾

  f.seek()   seek里的参数移动的是字节

f.seek(6)   # 移动6个字节. 2个字
s = f.read(3)   # 读取3个字
print(s)
f.seek(0)
ss = f.read(3)
print(ss)

8 .文件内容修改

  文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字.

import os
with open("../er,",mode="r",encoding="utf-8")as f1,open("../er_副本",mode="w",encoding="utf-8")as f2:
    s = f1.read()
    ss = s.replace("肉", "菜")
    f2.write(ss)
os.remove("er")
os.rename("er_副本","er")

   弊端: ⼀次将所有内容进行读取. 内存溢出      解决方案:⼀行一行的读取和操作

import os
with open("../er,",mode="r",encoding="utf-8")as f1,open("../er_副本",mode="w",encoding="utf-8")as f2:
    for line in f1:
        s = line.replace("肉","菜")
        f2.write(s)                 #一定要缩进,不要和f2对其.
   f2.flush()
   f2.close()
os.remove("er") os.rename("er_副本","er")

9 .truncate()截断

#火锅鸭血粉丝汤
f = open("梨小",mode="r+",encoding="utf-8")
f.seek(12)
# f.truncate()            #truncate()不给参数,从文件头截取到当前位置  火锅鸭血
f.truncate(15)            #truncate()给了参数,从文件头截取到你给这个参数的位置
f.flush()
f.close()

10. 判断文件是否可读

f = open("亵渎", mode="r", encoding="UTF-8")
# 如何判断这个文件可以进行什么操作
# print(f.readable()) # 判断文件是否可读
# print(f.writable()) # 是否可写入

11. readlines:

  readlines()将一行形成一个元素, 放到一个列表中. 将所有的内容都读取出来. 所以也是容易出现内存崩溃的问题.不推荐使用.

f = open("梨",mode="r",encoding="utf-8")
lst = f.readlines()                  #拿到列表
for s in lst:
    ss = s.strip()                   #去掉空格,还可以去掉换行符,制表符
    print(ss)
f.flush()
f.close()

12. 循环读取.这种方式是最好的,每次读取一行内容,不会产生内存溢出的问题.

f = open("梨",mode="r",encoding="utf-8")
for line in f:
    print(line.strip())
f.close()

13. strip():可以去掉空格,还可以去掉换行符,制表符

s = "	哈哈哈"
print(s.strip())                  #	就是tab键

14. 例题:

文件内容a1.txt:

序号   部门  人数  平均年龄  备注

1    python  30  26    单身狗

2    linux   26  30    没对象

3    运营部  20  20    女生多

通过代码实现,将其构建成这种模型:

[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},......]

    f = open("liu", mode="r", encoding="utf-8")
    line = f.readline()
    lst = line.split()  # 第一行切割完成 key就准备完了
    result = []
    # 接着向后读取
    for lin in f:
        ll = lin.split()    # 每一行都进行切割
        dic = {}
        for i in range(len(ll)):    # i 表示ll的索引
            # lst[i]    # key
            # ll[i]        # value
            dic[lst[i]] = ll[i]
        result.append(dic)
    print(result)

  


  

 

  

原文地址:https://www.cnblogs.com/gyh412724/p/9295984.html