• 文件操作


    读操作

    一.只读

    美女模特空姐护士联系方式.txt
    

    文件路径: D:美女模特空姐护士联系方式.txt 编码:utf-8,gbk,gb2312.... 模式:只读,只写,追加,写读,读写....

    使用open()来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了

    打开文件的方式:

      r,w,a

      r+,w+,a+

      rb,wb,ab

      r+b,w+b,a+b

    r模式

    f = open('美女模特空姐护士联系方式.txt',mode='r',encoding='utf-8')
    content = f.read()
    print(content)
    f.close()
    
    结果:
    标题很好
    

    open中第一个参数放入的是要打开的文件名字,第二个参数是要对这个文件进行的操作,第三参数是用什么编码方式打开文件中的内容.

    f 可写成任意变量等,它被称作:文件句柄,文件操作符,或者文件操作对象等。 open 是Python调用的操作系统(windows,linux,等)的功能,而windows的默认编码方式为gbk,linux默认编码方式为utf-8,所以你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8。 mode为打开方式:常见的有r,w,a,r+,w+,a+.rb,wb,ab,等,默认不写是r。 流程就是打开文件,产生一个文件句柄,对文件句柄进行相应操作,关闭文件。

    rb 模式

    r只读,rb只读字节

    f = open('护士少妇萝莉',mode='rb')
    content = f.read()
    print(content)
    f.close()
    
    结果:
    b'xe6xa0x87xe9xa2x98xe5xbex88xe5xa5xbd'
    

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

    rb的作用:在读取非文本文件的时候,比如要读取mp3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的,这个字节的模式是用于传输和存储。

    二.路径

    相对路劲

    就是相对于某个文件来说,进行路劲查找,以上代码是相对于运行的文件

    绝对路径

    绝对路径是从咱们电脑的磁盘开始查找

    一.写模式

    覆盖写

    刷新flush()

    f = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
    f.write('太白很白')
    f.flush()
    f.close()
    
    结果:
    当我选择使用w模式的时候,在打开文件的时候就就会把文件中的所有内容都清空,然后在操作
    

    注意点:如果文件不存在使用w模式会创建文件,文件存在w模式是覆盖写,在打开文件时会把文件中所有的内容清空.

    f1 = open('../path1/小娃娃.txt',mode='r',encoding='utf-8')
    msg = f1.read()
    print(msg)
    
    # 这个是先查看小娃娃文件中有哪些内容
    
    
    f = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
    f.write('太白很白')
    f.flush()
    f.close()
    # 这个是对小娃娃文件进行覆盖写操作
    
    
    f1 = open('../path1/小娃娃.txt',mode='r',encoding='utf-8')
    msg = f1.read()
    print(msg)
    
    # 查看覆盖写后的内容
    

    尝试读一读

    f1 = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
    msg = f1.read()
    print(msg)
    
    结果:
    Traceback (most recent call last):
      File "D:/python_object/path2/test.py", line 563, in <module>
        msg = f1.read() 
    io.UnsupportedOperation: not readable    #模式是w,不可以执行读操作
    

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

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

    追加

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

    在追加模式下,写入的内容后追加在文件的末尾

    a模式如果文件不存在就会创建一个新文件

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

    +模式

    读写模式

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

    r+模式

    看下正确的操作:

    f1 = open('../path1/小娃娃.txt',mode='r+',encoding='utf-8')
    msg = f1.read()
    f1.write('这支烟灭了以后')
    f1.flush()
    f1.close()
    print(msg)
    结果:
    正常的读取之后,写在结尾
    

    看下错误的操作:

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

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

    r+模式坑

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

    写读模式

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

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

    w+模式下 其实和w模式一样,把文件清空了,在写的内容.

    追加读(a+,a+b)

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

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

    一.其他相关操作

    seek()

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

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

    移动到开头:seek(0,0)

    移动到当前位置:seek(0,1)

    移动到末尾:seek(0,2)

    移动1个字:seek(3) 移动光标是按照字节进行移动

    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() 
    tell()
    

    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()
    

    修改文件

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

    import os
    with open("../path1/小娃娃", mode="r", encoding="utf-8") as f1,
    open("../path1/小娃娃_new", mode="w", encoding="UTF-8") as f2:
        content = f1.read()
        new_content = content.replace("冰糖葫芦", "⼤白梨")
        f2.write(new_content)
    os.remove("../path1/小娃娃") # 删除源文件
    os.rename("../path1/小娃娃_new", "小娃娃") # 重命名新文件
    

    弊端: ⼀次将所有内容进行读取. 内存溢出. 解决方案: 一行一行的读取和操作
    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", "小娃娃") # 重命名新文件

  • 相关阅读:
    为什么一刷新页面session没了
    Dedecmsv5.7整合ueditor 图片上传添加水印
    DedecmsV5.7本地上传缩略图无法自动添加水印的解决方法
    mysql find_in_set()函数的使用
    利用phpqrcode二维码生成类库和imagecopymerge函数制拼接图片的经验
    dedecms自定义表单时间时间戳值类型的转换方法
    jquery 根据自定义属性选择
    jquery快速获得url 的get传值
    自定义Bean初始化和销毁方法
    Spring常用注解
  • 原文地址:https://www.cnblogs.com/sundawei7/p/11190987.html
Copyright © 2020-2023  润新知