• (17)-Python3之--文件操作


    1.文件的操作流程

      第一,建立文件对象。
      第二,调用文件方法进行操作。
      第三,不要忘了关闭文件。(文件不关闭的情况下,内容会放在缓存,虽然Python会在最后自动把内容读到磁盘,但为了以防万一,要养成关闭文件的习惯)

    先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。语法:

    语法:
    f = open(file_name [, access_mode][, buffering])

    参数:
    file_name:是一个包含了你要访问的文件名的字符串值。
    access_mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表,这个参数是非强制的,默认文件访问模式为只读(r)。
    buffering:如果buffering的值被设为0,就不会有寄存;如果buffering的值取1,访问文件时会寄存行;如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小;如果取负值,寄存区的缓冲大小则为系统默认。

    2.打开文件

    打开文件的三种方式:
      open(r'E:学习日记pythoncode文件的简单操作.py')
      open('E:\学习日记\python\code\文件的简单操作.py')
      open('E:/学习日记/python/code/文件的简单操作.py')
      #字符串前面加一个r代表原生的raw
      # rt,wt,at:r读,w、a写,t表示以文本打开

     3.File对象的属性

    一个文件被打开后,会得到一个file对象,你可以得到有关该文件的各种信息。
    以下是和file对象相关的所有属性的列表:

    # 打开一个文件
    f = open("file.txt", "wb")
    print("文件名: ", f.name)
    print("是否已关闭 : ", f.closed)
    print("访问模式 : ", f.mode)
    
    结果:
    文件名:  file.txt
    是否已关闭 :  False
    访问模式 :  wb

    4.close() 函数

    File对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

    # 打开一个文件
    f = open("file.txt", "wb")
    print("文件名: ", f.name)
    
    # 关闭打开的文件
    f.close()
    
    结果:
    文件名:  file.txt

    5.文件操作---读

    read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

    有如下文件:

    5.1读取整篇文件内容

    # 打开一个文件
    f = open("file.txt", "r",encoding='utf8')
    f_read = f.read()  # 通过read()进行读取
    print(f_read)
    
    # 关闭打开的文件
    f.close()
    
    结果:
    尊敬的公司领导:
    此时辞呈敬请海涵。
    当初公司募才纳新,未嫌我才疏学浅,承蒙收容。
    入职以来领导厚爱,同事相亲,至今心怀感念,不敢稍有遗忘,勤心劳作,不求闻达富贵,薪酬所愿只需温饱残喘,欲效犬马,以图恩报。
    时至今日,事与愿违,本当坚持,然效亲养身,责任在肩,今日请辞实属无奈,提携之恩,栽培之情,铭记五内,永无所愿,人生有时必当回报。
    去聘人手以需时日,一月之内必当坚守,词不达意上体见谅。
    此致!
    敬礼!

    5.2读取指定字符

    read()方法可以指定参数,设定需要读取多少字符,无论一个英文字母还是一个汉字都是一个字符。

    # 打开一个文件
    f = open("file.txt", "r",encoding='utf8')
    f_read = f.read(8)  # 通过指定参数读取字符。
    print(f_read)
    
    # 关闭打开的文件
    f.close()
    
    结果:
    尊敬的公司领导:

    5.3读取一行内容

    readline只能读取第一行代码,原理是读取到第一个换行符就停止。

    # 打开一个文件
    f = open("file.txt", "r",encoding='utf8')
    f_read = f.readline()  # 读取一行内容。
    f_read2 = f.readline() # 再读取一行内容。
    print(f_read,f_read2)
    
    # 关闭打开的文件
    f.close()
    
    结果:
    尊敬的公司领导:
     此时辞呈敬请海涵。

    5.4把内容以列表的形式输出

    readlines会把内容以列表的形式输出。

    # 打开一个文件
    f = open("file.txt", "r",encoding='utf8')
    f_read = f.readlines()  # 以列表的形式输出。
    print(f_read)
    
    # 关闭打开的文件
    f.close()
    
    结果:
    ['尊敬的公司领导:
    ', '此时辞呈敬请海涵。
    ', '当初公司募才纳新,未嫌我才疏学浅,承蒙收容。
    ', '入职以来领导厚爱,同事相亲,至今心怀感念,不敢稍有遗忘,勤心劳作,不求闻达富贵,薪酬所愿只需温饱残喘,欲效犬马,以图恩报。
    ', '时至今日,事与愿违,本当坚持,然效亲养身,责任在肩,今日请辞实属无奈,提携之恩,栽培之情,铭记五内,永无所愿,人生有时必当回报。
    ', '去聘人手以需时日,一月之内必当坚守,词不达意上体见谅。
    ', '此致!
    ', '敬礼!']

    5.5通过for循环可以把内容按字符串输出

    # 打开一个文件
    f = open("file.txt", "r",encoding='utf8')
    for line in f.readlines():  # 使用for循环可以把内容按字符串输出。
        # 因为文件中每行内容后面都有一个换行符,输出一行内容后就会输出一个空行,
        # 而且print()语句本身就可以换行,
        # 如果不想输出空行,就需要使用下面的语句:print(line.strip())
        print(line.strip()) 
    
    # 关闭打开的文件
    f.close()
    
    结果:
    尊敬的公司领导:
    此时辞呈敬请海涵。
    当初公司募才纳新,未嫌我才疏学浅,承蒙收容。
    入职以来领导厚爱,同事相亲,至今心怀感念,不敢稍有遗忘,勤心劳作,不求闻达富贵,薪酬所愿只需温饱残喘,欲效犬马,以图恩报。
    时至今日,事与愿违,本当坚持,然效亲养身,责任在肩,今日请辞实属无奈,提携之恩,栽培之情,铭记五内,永无所愿,人生有时必当回报。
    去聘人手以需时日,一月之内必当坚守,词不达意上体见谅。
    此致!
    敬礼!

    5.6readable()检查文件是否可读(返回布尔类型)

    # 打开一个文件
    f = open("file.txt", "r",encoding='utf8')
    res = f.readable()
    print(res)
    
    # 关闭打开的文件
    f.close()
    
    结果:
    True

    6.文件操作---写

    文件操作中的写有两种:

      w:覆盖写
      a:追加写

    write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。write()方法不会在字符串的结尾添加换行符(' '):

    6.1覆盖写:

    原有的文件内容是:

    进行文件的覆盖写入:

    # 打开一个文件
    f = open('file.txt','w',encoding='utf8')
    f_w = f.write('hello world')
    print(f_w)  # 有意思的是,这里并不打印'hello world',只打印写入多少字符
    
    # 关闭打开的文件
    f.close()
    
    结果:
    11

    写入后的文件内容是:

     6.2追加写

    原有文件内容是:

    进行文件的追加写入:

    # 打开一个文件
    f = open('file.txt','a',encoding='utf8')
    f_w = f.write('没有钱,我很难为你办事啊!!')
    print(f_w)  # 有意思的是,这里并不打印'hello world',只打印写入多少字符
    
    # 关闭打开的文件
    f.close()
    
    结果:
    14

    写入后文件内容是:

     6.3writelines()传入可迭代对象变成字符串写入文件

    writelines() 方法用于向文件中写入一序列的字符串。

    这一序列字符串可以是由迭代对象产生的,如一个字符串列表。

    换行需要制定换行符 。

    语法:
    fileObject.writelines(iterable)
    
    参数:
    iterable -- 可迭代对象(字符串、列表、元祖、字典)。
    # 打开文件
    f = open("file.txt", "w", encoding="utf-8")
    seq = ["文件操作教程 1
    ", "文件操作教程 2"]
    f.writelines(seq)
    
    # 关闭文件
    f.close()

    写入后的文件内容:

     6.4writable()判断文件是否可写

    # 打开一个文件
    f = open("file.txt", "w",encoding='utf8')
    res = f.writable()
    print(res)
    
    # 关闭打开的文件
    f.close()
    
    结果:
    True

    6.5bytes类型读、写、追加

    字节类型的读写和追加只需要在原有的读写追加后面加一个"b"就可以了。

      读:rb

    # 打开文件
    f = open("file.txt", "rb")
    a = f.read()
    print(a)
    print(a.decode('utf-8'))
    
    # 关闭文件
    f.close()
    
    结果:
    b'xe6x96x87xe4xbbxb6xe6x93x8dxe4xbdx9cxe6x95x99xe7xa8x8b 1'
    文件操作教程 1

      写:wb

    # 打开文件
    f = open("file.txt", "wb")
    f.write(b'hello world') # 字符串前面加b(不支持中文)
    f.write("
    你好 世界".encode('utf-8'))
    
    # 关闭文件
    f.close()

      追加:ab

    # 打开文件
    f = open("file.txt", "ab")
    f.write("
    什么是软件?
    软件是计算机程序、程序所用的数据以及有关文档资料的集合。
    软件又可以分为两大类:系统软件和应用软件。".encode('utf-8'))
    
    # 关闭文件
    f.close()

     7.tell和seek

    tell:查询文件中光标位置
    seek:光标定位

    有一个文件内容如下:

     查询文件中光标位置:

    # 打开文件
    f = open("file.txt", "r")
    # 前面的数字代表移动的字符或字节,后面的数字代表模式(0:光标在开头,1:代表相对位置,2:代表光标在末尾)
    f.seek(10,0)
    f_tell = f.tell()
    print(f_tell)
    
    # 关闭文件
    f.close()
    
    结果:
    10
    
    注:
    r模式:光标默认在起始位置
    w模式:先清空内容,光标回到0位置
    a模式:光标默认在最后位置
    # 打开一个文件
    f = open("file.txt", "r+", encoding='utf-8')
    str = f.read(31) # 读取31个字符
    print("读取的字符串是 : ", str)
    
    # 查找当前位置
    position = f.tell()
    print("当前文件位置 : ", position)
    
    # 把指针再次重新定位到文件开头
    position = f.seek(0, 0)
    str = f.read(8) # 这次读取8个字符
    print("重新读取字符串 : ", str)
    
    # 关闭打开的文件
    f.close()
    
    结果:
    读取的字符串是 :  You were the shadow to my light
    当前文件位置 :  31
    重新读取字符串 :  You were

    8.flush 同步将数据从缓存转移到磁盘

    示例,实现进度条功能:

    import sys,time  # 导入sys和time模块
    for i in range(40):
      sys.stdout.write('*')
      sys.stdout.flush()  # flush的作用相当于照相,拍一张冲洗一张
      time.sleep(0.2)
      
    # 下面代码也能够实现相同的功能
    import time
    for i in range(40):
      print('*',end='',flush=True) # print中的flush参数
      time.sleep(0.2)

    9.truncate 截断

      不能是r模式下执行
      w模式下,已经清空所有数据,使用truncate没有任何意义
      a模式下,截断指定位置后的内容

    f = open('file.txt','a+')
    f.truncate(8) #只显示6个字节的内容(6个英文字符或三个汉字,一个汉字占两个字节),后面的内容被清空。
    f.seek(0,0) # 光标定位到开头
    print(f.read())
    
    结果:
    You were

    10.文件操作---修改

    思路:由于数据存储机制的关系,我们只能把文件1中的内容读取出来,经过修改后,放到文件2中。

    原文件内容为:

     我们把“又是新的开始”改成英文的“It's a new beginning”:

    f1 = open('file.txt','r',encoding='utf8')   # f1是我们原文件
    f2 = open('file2.txt','w',encoding='utf8')  # f2是新文件
    for line in f1: # 迭代器
        if "又是新的开始" in line:
            line = line.replace("又是新的开始","It's a new beginning")
        f2.write(line)
    
    # 关闭文件
    f1.close()
    f2.close()

    然后查看文件2的内容:

     11.with语句

    当with代码块执行完毕时,会自动关闭文件释放内存资源,不用特意加f.close(),而且可以同时对多个文件同时操作。
    用with语句重写修改文件中的代码:
    with open('file.txt','r',encoding='utf8') as f1,
        open('file2.txt','w',encoding='utf8') as f2:
        for line in f1:  # 迭代器
            if "又是新的开始" in line:
                line = line.replace("又是新的开始","It's a new beginning")
            f2.write(line)
  • 相关阅读:
    [ZJOI2010]count 数字计数
    小雄数
    简单筛法函数
    [Noip模拟题]lucky
    欧拉线筛
    Intern Day78
    CodeForces1360C
    CodeForces1373B
    Intern Day78
    Intern Day78
  • 原文地址:https://www.cnblogs.com/renshengruxi/p/14286448.html
Copyright © 2020-2023  润新知