python 文件读写

创建一个文件对象

创建完对象记着关闭,使用 with as的方法可以自动关闭对象,避免复杂的写法。

代码1-1
# 常规
try:
    f = open("b.txt", "r+")
except FileNotFoundError as e:
    print('没有找到文件')
finally:
    if f:
        f.close()

# with as
with open("b.txt", "r+") as f:
    pass
表1-2
打开方式 模式 文件 指针
r 只读 无文件抛出FileExistsError seek(0,0)
w 只写 创建文件,已有文件覆盖(不可以创建目录,需要请使用makedirs()等os方法) seek(0,0)
x 创建 创建文件,已有文件抛出FileExistsError seek(0,0)
a 追加 没有文件则创建文件 seek(0,2)不可更改
b 二进制 无更改
t 文本模式(默认) 无更改
+ 获得读写的功能 无更改
  • seek定义

    offset ( 偏移量)

    whence:可选,默认值0。0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

    我们看到seek方法有一个返回值int,这个就是文件的指针索引。

    @abstractmethod
    def seek(self, offset: int, whence: int = 0) -> int:
        pass
    

    b.txt文件中的内容:abcdefg**。一共有有9个字符。

    代码1-3
    f = open(r"E:\PycharmProjects\pythonProject1\b.txt", "r+")
    f.seek(0,1)			#r+模式默认字符指针为0
    0
    f.seek(15)			#偏移量加15,字符指针指向15。
    15
    f.seek(16)			#偏移量加16,字符指针指向16,偏移量并没有累加,每次都是绝对于0变化。
    16
    f.seek(0)
    0
    
    f.seek(1,1)			#whence不为默认参数0的话,offset(偏移量)一定要为0,否则抛出错误。
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    io.UnsupportedOperation: can't do nonzero cur-relative seeks
        
    f.seek(0,2)			#看了上一条就知道whence不为0,offset(偏移量)是没有价值的,原字符的长度为9,所以末尾的字符指针指向9。
    9
    f.seek(0,1)			#上一条指向9,所以当前位置也等于9。
    9
    
  • 读入和写出常用函数

    代码1-4
    with open("a.txt", "w+", encoding="utf-8") as f:
        print(f.writable())  # 是否可以写
        print(f.readable())  # 是否可以读
        print(f.tell())  # 返回当前字节数 f.tell()等价于f.seek(0, 1)、
    
        f.write("将进酒\n")  # 全部写入
        f.writelines(["君不见黄河之水天上来,", "奔流到海不复回。\n", "君不见高堂明镜悲白发,", "朝如青丝暮成雪。\n"])  # 数组写入
    
        f.seek(0, 0)
        print(f.read(), end='')  # 全部读
    
        f.seek(0, 0)
        print(f.readline(), end='')  # 读一行
        for s in f.readlines():  # 一行一行的读
            print(s, end='')
    
        f.seek(0, 0)
        print(f.readline(10))
        print(f.readline(1))
        print(f.readline(1))
    
        print(f.readlines(18))  # 18>光标大于当前行,小于下一行,从当前位置输出到下一行结束
        print(f.readlines(1))  # 光标已经结尾,输出空行
    
        f.seek(15, 0)
        f.truncate()  # 从文章开头保留到光标位置,一共15个字节,和上一句一起可以简化为 f.truncate(15)。
    

    注:行输出包括换行回车(windows:'/n')。

    遇到中文python自动使用'GBK',如果文本是其他格式,打开文件要用encoding="格式"选择指定的格式。

    默认的打开模式为文本。

    假如文本有10个字符,在已有0字符位写入8个字符,将会覆盖原来字符(1-8),没有没覆盖的则不变(9-10)。

  • 实例

    在b.txt(abcdefg**)中的**前面插入一个’/‘,并输出b.txt的长度和b.txt的内容。

    代码1-5
    with open("b.txt", "r+") as f:
        f.seek(0,2)
        f.write('*')
        f.seek(7)
        f.write('/')
        print(f.seek(0,2))
        f.seek(0)
        print(f.read())
    

    将一个视频复制一份。

    代码1-6

with open(r'C:\Users\raoji\Videos\Captures\绝地求生  2018-10-11 18-46-14.mp4','rb') as f:
    with open(r'C:\Users\raoji\Videos\Captures\绝地求生1.mp4', 'wb') as f1:
        s = f.read(1024)
        while s != b'':
            f1.write(s)
            s=f.read(1024)
posted @ 2020-12-16 00:37  探索星空  阅读(64)  评论(0编辑  收藏  举报