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

    一、初始文件操作:

      使用Python来读写文件是非常简单的操作。

      我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行操作了,根据打开方式的不同能够执行的操作也会有相应的差异。

    二、文件操作模式

    只读操作-- 'r'

    #文件操作默认'r'模式
    # ------------ r ------------
    f = open('123','r',encoding='utf-8') #句柄
    content = f.read()
    # 一次性将文件内容全都读出来,但是如果内容很多,会崩溃的
    print(content)
    con_1 = f.readline()#将内容一行一行输出
    con_2 = f.readline()
    print(con_1+con_2)
    
    ls = f.readlines() # 返回list 遍历列表即可得到内容
    s = ''
    for i in ls:
        s = s + i
    print(s)

    'rb' 读取出来的是bytes类型,不能选择encoding字符集

    # -------- rb --------
    f = open('文件示例','rb') #句柄
    print(f.read()) # b'xe4xbdxa0xe5x9cxa8
    '
    #UTF-8编码下 一个中文占3个字节

    rb的作用:

    在读取非文本文件的时候,比如读取MP3图像、视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的,在后面我们文件上传下载的时候还会用到。

    相对路径和绝对路径:

    1、绝对路径:从磁盘根目录开始一直到文件名

    2、相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言。如果在同一个文件夹中,则相对路径就是这个文件名,如果在上一层文件夹,则要../(跳出当前文件夹)

    #相对路径和绝对路径
    #相对路径 ../跳出当前文件夹
    # f = open('../day06/文件示例',mode='r',encoding='utf-8')
    # print(f.read())
    
    #绝对路径 -- 在磁盘中存在的位置
    # f = open('/Users/langying/Desktop/hello.txt','r',encoding='utf-8')
    # content = f.read()
    # print(content)
    # f.close() #关闭文件句柄
    View Code

    我们更推荐大家使用相对路径。因为我们在把程序拷贝给别人使用的时候,直接把项目拷贝走就可以运行,但是如果用绝对路径,还需要拷贝外部文件。

    读取文件的方法:

    (1)read():将文件中的内容全部读取出来,弊端:占内存,如果文件过大,容易导致内存崩溃

    (2)read(n):读取n个字符,注意:如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式,,则读取出来的是n个字节。

    (3)readline():一行一行读取数据

    (4)readlines():将每一行形成一个元素,放到一个列表中。将所有的内容都读取出来,容易出现内存崩溃的问题

    (5)循环读取

    # ------------ r ------------
    f = open('123','r',encoding='utf-8') #句柄
    content = f.read()
    # 一次性将文件内容全都读出来,但是如果内容很多,会崩溃的
    print(content)
    con_1 = f.readline()#将内容一行一行输出
    con_2 = f.readline()
    print(con_1+con_2)
    
    print(f.read(3)) #一次性读3个字节
    
    ls = f.readlines() # 返回list 遍历列表即可得到内容
    for i in ls:
        print(i) #循环读取
    View Code

    读取完一定要关闭 f.close()

    写模式

    # -------- w -----------
    f = open('123','w',encoding='utf-8')
    # 文件名不存在则创建新文件
    f.write('写模式下会先删除原来的内容,再继续写')
    
    # wb 模式 可以不指定打开文件的编码,但是写文件的时候一定写入bytes数据
    f =  open('123',mode='wb')
    f.write('金毛狮王'.encode('utf-8'))
    f.flush()
    f.close()
    View Code

    追加模式

    # --------- a ----------
    f = open('123','a',encoding='utf-8')
    f.write('a - append 从原来内容末尾追加')
    f.close()

    读写模式

    对于读写模式,必须是先读,因为默认光标在开头,读完了在进行写入

    # --------- r+ 可读可写 侧重读 ------------
    f = open('123','r+',encoding='utf-8')
    
    #正常的顺序应该先读再写
    content = f.read() #光标从头开始读到尾
    print(content)
    f.write('你好啊') #光标从尾开始继续写内容
    f.flush() #保证所有的文本都写到了内容里面
    content = f.read() #读不出来了,因为光标已经到了最后了
    print(content) #
    f.close()
    
    #尝试一下先写后读 -- 不可以的
    f.write('你好啊') #文件开头从"你在干"变成了'你好啊'
    #因为文件光标刚开始在开头,所以当你执行写操作的时候,光标从开头覆盖原文本
    print(f.read()) #读取的内容不全
    #光标在执行完写操作以后,光标已经停留到了'你好啊'后,所以无法打出这三个字
    f.flush()
    f.close()
    View Code

    写读模式

    在w+模式下,必须先读后写

    # --------- w+ --------
    f = open('文件示例','w+',encoding='utf-8')
    f.write('将文件内容清空,然后写入')
    print(f.read()) #读不出来,因为光标在最后
    f.flush()
    f.close()

    追加读模式

    a+模式下,无论先读还是后读都是读不到数据的

    # ---------- a+ --------
    f = open('文件示例','a+',encoding='utf-8')
    f.write('在末尾追加')
    print(f.read()) #读不出来,因为光标在最后
    f.flush()
    f.close()

    其他操作

    # 移动光标的方法
    f = open('123','r+',encoding='utf-8')
    f.seek(0) #将光标移动到开头
    f.seek(0,2) #将光标移动到结尾
    f.tell() #光标所在位置
    f.truncate()#将后面所有的内容全部截掉
    f.close()

    注意:

    在r+模式下,如果读取了多少内容,光标显示的多少,再写入或者操作文件的时候都是在结尾进行的操作。

    所以如果想做截断操作,要先移动光标,移动到你想要截断的位置,再进行截断。

    关于截断操作:如果给出了n,则从开头进行截断,不给n,则从当前位置截断,后面的内容将会被删除。

    修改文件以及另一种文件打开方式:

    #不用每次都f.close()的方法
    with open('123','r+',encoding='utf-8') as f:
        pass
    
    
    #将文件中的Alex全部替换成'Tommy'
    #打开老文件,将内容替换,再生成一份新文件,删除旧文件,重命名新文件
    with open('123','r+',encoding='utf-8') as f ,
        open('123_1','w',encoding='utf-8') as f1:
        for i in f:
            # print(i.strip())
            i = i.replace('Alex','Tommy')
            f1.write(i)
    #在文件开始导入os模块
    os.remove('123') #删除旧文件
    os.rename('123_1','123') #将新文件改名字
  • 相关阅读:
    数据库(DB)
    PHP课程设计
    版本号设计规则
    设计模式(Java)
    简单的流式布局(移动应用开发)
    laravel工作机制(PHP程序设计)
    接口自动化测试(软件测试)
    Java学习路线
    ES6基础知识
    promise
  • 原文地址:https://www.cnblogs.com/liangying666/p/9156204.html
Copyright © 2011-2022 走看看