zoukankan      html  css  js  c++  java
  • 文件的读写操作

    文件的读操作:open()

    - 第一个参数必须有,表示文件的绝对路径或者相对路径

    - 第二个参数mode,表示文件打开的方式

    'r':读

    'w':写

    'a':追加

    'r+' == r+w(可读可写,文件若不存在就报错(IOError))

    'w+' == w+r(可读可写,文件若不存在就创建)

    'a+' ==a+r(可追加可写,文件若不存在就创建)

    对应的,如果是二进制文件,就都加一个b:

    'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'

    f = open(r'..vscodeproject	est.txt', 'r')#使用了相对路径
    print(f.read())
    f.close()

    文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,更重要的是,没有关闭文件则修改或者添加的内容还没有全部写入磁盘,其他文件读取的时候是无法获得的!

    如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:

    FileNotFoundError: [Errno 1] No such file or directory: 'test.txt'

    由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

    try:
        f = open('D:/Python/.vscode/project/test.txt', 'r')#使用了绝对路径
        print(f.read())
    finally:
        if f:
            f.close()

    但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:with语句使用的技术是一种叫做上下文管理协议的技术,它可以自动判断文件的作用域,自动关闭不在使用的打开的文件句柄

    #如果路径前没有r则要用\转义字符或者使用/,r表示按原始字符处理
    with open(r'D:Python.vscodeproject	est.txt', 'r') as f:
        print(f.read())

    python文件对象提供了三个“读”方法: read()、readline() 和 readlines(),每种方法可以接受一个变量以限制每次读取的数据量:

    • read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
    • readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。
    • readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。

    注意:这三种方法是把每行末尾的' '也读进来了,它并不会默认的把' '去掉,需要我们手动去掉,仔细比较下面几种写法的区别:

    - readlines():

    with open('D:/Python/.vscode/project/test.txt', 'r') as f:
        list = f.readlines()
        print(list)
    #['123
    ', '456
    ', '789
    ']
    with open('D:/Python/.vscode/project/test.txt', 'r') as f:
        list = f.readlines()
        for i in list:
            print(i)
    #123
    #
    #456
    #
    #789
    #

    去掉' '的方法:

    with open('D:/Python/.vscode/project/test.txt', 'r') as f:
        list = f.readlines()
        for i in range(len(list)):
            list[i] = list[i].rstrip('
    ')
        print(list)
    #['123', '456', '789']

    - read():

    with open('D:/Python/.vscode/project/test.txt', 'r') as f:
        list = f.read()
        print(list)
    #123
    #456
    #789
    #
    with open('D:/Python/.vscode/project/test.txt', 'r') as f:
        list = f.read()
        for i in list:
            print(i)
    #1
    #2
    #3
    #
    #
    #4
    #5
    #6
    #
    #
    #7
    #8
    #9
    #
    #

    - readline():

    with open('D:/Python/.vscode/project/test.txt', 'r') as f:
        list = f.readline()
        print(list)
    #123
    #
    with open('D:/Python/.vscode/project/test.txt', 'r') as f:
        list = f.readline()
        for i in list:
            print(i)
    #1
    #2
    #3
    #
    #

    seek(offset, from):移动文件的读取位置,也叫读取指针

    • from的取值范围:
      • 0: 从文件头开始偏移
      • 1:从文件当前位置开始偏移
      • 2: 从文件末尾开始偏移
    • 移动的单位是字节(byte)
    • 一个汉子由若干个字节构成
    • 返回文件只针对 当前位置
    # 打开文件后,从第5个字节出开始读取
    # 打开读写指针在0处, 即文件的开头
    with open(r'test01.txt', 'r') as f:
        # seek移动单位是字节
        f.seek(6, 0)
        strChar = f.read()
        print(strChar)

    tell():用来显示文件读写指针的当前位置,单位是字节

    with open('D:/Python/.vscode/project/test.txt', 'r') as f:
        s = f.read(2)
        ft = f.tell()
        while s:
            print(ft)
            print(s)
            
            s = f.read(2)
            ft = f.tell()
    #2
    #my
    #4
    # n
    #6
    #am
    #8
    #e
    #10
    #is
    #12
    # w
    #14
    #jw

    文件的写操作:write()

    • write(str): 把字符串写入文件
    • writelines(str): 把字符串按行写入文件
    • 区别:
      • write函数参数只能是字符串
      • writerlines参数可以是字符串,也可以是字符序列
    f = open('test.txt', 'w') # 若是'wb'就表示写二进制文件
    f.write('Hello, world!')
    f.close()

    注意:'w'这个模式是这样的:如果没有这个文件,就创建一个;如果有,那么就会先把原文件的内容清空再写入新的东西。所以若不想清空原来的内容而是直接在后面追加新的内容,就用'a'这个模式

    我们可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:

    with open('test.txt', 'w') as f:
        f.write('Hello, world!')
    # a代表追加方式打开,只能在文件末尾增加不能修改
    with open('D:/Python/.vscode/project/test.txt', 'a') as f:
        f.writelines(' i love it 
    ')
        f.writelines(' and i hate it 
    ')

    注意:换行符不会自动的加入,因此,需要显式的加入换行符!

  • 相关阅读:
    AcWing 524. 愤怒的小鸟
    AcWing 算法提高课题解目录
    AcWing 292. 炮兵阵地
    AcWing 798. 差分矩阵
    golang 写数据到excel文件 清明
    使用golang开发mqtt服务压力测试工具 清明
    Linux云服务器安装JDK步骤 清明
    shell monitor memory 清明
    自己实现一个Electron跨进程消息组件(兼新书自荐)
    如何把Electron做成一个Runtime,让多个应用共享同一个Electron
  • 原文地址:https://www.cnblogs.com/wjw2018/p/10536284.html
Copyright © 2011-2022 走看看