• 文件操作


    文件操作

    使用Python来读写文件是非常简单的操作,使用open()函数来打开一个文件,获取到一个文件句柄,然后通过文件句柄就可以进行各种格样的操作了

    打开文件方式:

    r      w     a 
    r+     w+    a+
    rb     wb    ab
    r+b    w+b   a+b
      

    默认使用的是r(只读模式)

    只读操作(r/rb)

    f = open("护士少妇萝莉",mode="r",encoding="utf-8")   
    centent = f.read()   
    print(centent)
    f.close()
    
    结果:
    标题很好
    View Code

    f :文件句柄,可以通过文件句柄来操作文件

    open()函数: 打开护士少妇萝莉文件

    mode: 指定文件操作模式

    encoding: 指定编码

    close: 关闭文件

    f = open("护士少妇萝莉",mode="rb")
    centent = f.read()
    print(centent)
    f.close()
    
    结果:
    b'xe6xa0x87xe9xa2x98
    xe5xbex88xe5xa5xbd'    #
    是回车   
    是换行
    View Code

    rb :读出来的数据是bytes类型,在rb模式下,不能使用encoding字符串

    rb的作用:在读取非文本文件的时候,比如要读取mp3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的

    逐行读取

    read()将文件中的内容全部读取出来;弊端 如果文件很大就会非常的占用内存,容易导致内存奔溃

    f = open("护士少妇萝莉",mode="r",encoding="utf-8")
    for i in f:
        print(i)
    f.close()
    
    结果:
    标题很好           #读取一行一行的时候末尾会跟着
    
    护士
    
    少妇 
    
    萝莉
    View Code

    使用strip来去除空格

    f = open("护士少妇萝莉",mode="r",encoding="utf-8")
    for i in f:
        print(i.strip())  
    f.close()
    
    结果:
    标题很好
    护士
    少妇
    萝莉
    View Code

    read()读取的时候指定读取到什么位置,我们指定先读取前三个内容,然后在使用read()进行读取会继续向后读取,而不会从头开始读取

    f = open("护士少妇萝莉",mode="r",encoding="utf-8")
    ff = f.read(3)
    fff = f.read()
    print(ff)
    print(fff)
    
    结果:
    标题很   #读取3个#继续读取
    护士  
    少妇
    萝莉
    View Code

    写模式(w,wb)

    在写文件的时候我们要养成一个写完文件就刷新的习惯.  刷新flush()

    f = open("护士少妇萝莉",mode="w",encoding="utf-8")
    f.write("你好")
    f.close()
    View Code

    当选择使用w模式的时候,在打开文件的时候就会把文件的所以内容都清空,然后操作

    w模式会自动创建文件,wb模式下,不可以指定打开文件的编辑,但是写文件的时候必须将字符串转换成utf-8的bytes数据

    f = open('../path1/小娃娃.txt',mode='wb')
    msg = '你好'.encode('utf-8')
    f.write(msg)
    f.flush()  # 刷新
    f.close()
    View Code

    追加(a.b)

    只要是a或者ab,a+都是在文件的末尾写入,不论光标在任何位置.

    f1 = open('../path1/小娃娃.txt',mode='a',encoding='utf-8')
    msg = f1.write('这支烟灭了以后')
    View Code

    读写(r+,r+b)

    对于读写模式,必须是先读后写,因为光标默认在开头位置,当读完了以后再进行写入.我们以后使用频率最高的模式就是r+

    正确操作

    f1 = open('../path1/小娃娃.txt',mode='r+',encoding='utf-8')
    msg = f1.read()
    f1.write('这支烟灭了以后')
    f1.flush()
    f1.close()
    View Code

    错误操作

    f1 = open('../path1/小娃娃.txt',mode='r+',encoding='utf-8')
    f1.write('小鬼')
    msg = f1.read()
    f1.flush()
    f1.close()
    print(msg)
     
    结果:
    这样写会把小鬼写在开头,并且读出来的是小鬼之后的内容
    View Code

    r+模式一定要记住是先读后写

    深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入
    或者操作文件的时候都是在结尾进行的操作

    写读模式(w+,w+b)

    将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用

    f1 = open('../path1/小娃娃.txt',mode='w+',encoding='utf-8')
    f1.write('小鬼')
    msg = f1.read()
    f1.flush()
    f1.close()
    print(msg)
    View Code

    追加读(a+,a+b)

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

    f = open('../path1/小娃娃.txt',mode='a+',encoding='utf-8')
    f.write('阿刁')
    f.flush()
    msg = f.read()
    f.close()
    print(msg)
    View Code

    其他相关操作

    seek()

    seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数

    通常我们使用seek都是移动到开头或者结尾

    移动到开头:seek(0)

    移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾

    f = open("小娃娃", mode="r+", encoding="utf-8")
    f.seek(0) # 光标移动到开头
    content = f.read() # 读取内容, 此时光标移动到结尾
    print(content)
    f.seek(0) # 再次将光标移动到开头
    f.seek(0, 2) # 将光标移动到结尾
    content2 = f.read() # 读取内容. 什么都没有
    print(content2)
    f.seek(0) # 移动到开头
    f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
    f.flush()
    f.close()
    View Code

    tell()

    使用tell()可以帮我们获取当前光标在什么位置

    f = open("小娃娃", mode="r+", encoding="utf-8")
    f.seek(0) # 光标移动到开头
    content = f.read() # 读取内容, 此时光标移动到结尾
    print(content)
    f.seek(0) # 再次将光标移动到开头
    f.seek(0, 2) # 将光标移动到结尾
    content2 = f.read() # 读取内容. 什么都没有
    print(content2)
    f.seek(0) # 移动到开头
    f.write("张国荣") # 写入信息. 此时光标在9 中⽂文3 * 3个 = 9
    print(f.tell()) # 光标位置9
    f.flush()
    f.close()
    View Code

    truncate() 截断文件

    f = open("小娃娃", mode="w", encoding="utf-8")
    f.write("哈哈") # 写入两个字符
    f.seek(3) # 光标移动到3, 也就是两个字中间
    f.truncate() # 删掉光标后面的所有内容
    f.close()
    f = open("小娃娃", mode="r+", encoding="utf-8")
    content = f.read(3) # 读取9个字符
    f.seek(4)
    print(f.tell())
    f.truncate() # 后面的所有内容全部都删掉
    # print(content)
    f.flush()
    f.close()
    View Code

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

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

    import os
    with open("⼩小娃娃", mode="r", encoding="utf-8") as f1,
    open("⼩小娃娃_new", mode="w", encoding="UTF-8") as f2:
        for line in f1:
            new_line = line.replace("⼤大⽩白梨梨", "冰糖葫芦")
            f2.write(new_line)
    os.remove("⼩小娃娃") # 删除源⽂文件
    os.rename("⼩小娃娃_new", "⼩小娃娃") # 重命名新⽂文件
    View Code

    绝对路径和相对路径

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

    2.相对路径:用一个文件夹下的文件,相对于当前这个程序所在的文件而言.如果在同一个文件中,则相对路劲就是这个文件名.如果再上一层文件夹则要使用../

  • 相关阅读:
    【javascript】select操作实例
    【javascript】函数
    【javascript】一些资料
    【javascript】操作符:一元操作符
    动态执行Sql
    索引( index )
    事务
    用户相关
    视图(view)
    函数(function)
  • 原文地址:https://www.cnblogs.com/wanglan/p/9878038.html
Copyright © 2020-2023  润新知