• 路飞学城Python-Day7


    Moudle 2 1.鸡汤
    中国人均阅读4.35本;日本40本;韩国17本;法国20本;以色列60本
    成长的路上需要读书,坚持读书内心会得到升华的
    想法不要太多,尽量多读书,多充电
    多读书,多看报,少吃零食,多睡觉

    【2.三元运算】
    三元运算又称为三目运算,是对简单的条件语句的简写,节省代码量,但是不易读
    简单条件语句
    if 条件成立:
    val = 1
    else:
    val = 2
    改成三元运算:
    val = 1 if 条件成立 else 2

    【3.文件处理】
    在平时,假如给你一个文件你会怎么去操作,如何查看内容?
    用文本的编辑器打开就完事了。
    1.首先,你得有一个文本编辑器,安装一个文本编辑器
    2.选中右键,然后用文本编辑器打开文件
    3.查看文件内容或者写入任何的内容
    4.保存文件,关闭
    好了,我们用python去做吧
    文件操作分为读、写、修改,我们先从读开始
    f = open(file = 'E:/文件夹名字/filename.txt',mode = 'r', encoding = 'utf-8')
    data = f.read()
    f.close()
    ----mode 模式就是需要用什么方式去读取文件,就像mode = 'r'就是只读模式
    ----encoding 就是用什么编码模式去操作,在内存里保存的编码方式
    ----file 参数可以不写,默认就会在第一个参数里写文件名,不用绝对路径就是相对路径
    文件操作打开后报错了,UnicodedeDecodeError : 'utf-8' code can't decode byte....
    数据、文件内容在硬盘上是二进制的格式,读到内存里是转换编码的,所以读到字符里是有转换关系的
    字符编码表有很多种,如果这个文件本身是GBK的编码格式编制的,然后用UTF-8的格式再打开就会报错了
    GBK里的二进制的编码表对应不上utf-8的编码表,就会出现乱码,或者报错
    一定要记住是什么方式去存储的文件,然后要用同样的方式去打开文件,
    如果不指定的话,Pyhton3就会按照默认的方式('utf-8')去打开文件
    如何解决编码的错误呢?
    必须按照文件的原来的编码的格式,用python的方式指定编码格式去读取文件
    [ps]Pycharm打开文件会自动检测文件的原编码格式哦

    【4.文件处理-二进制模式】
    encoding就是告诉python指定什么编码模式转换成Unicode,python3里所有的字符串都是Unicode
    如果不知道文件的编码格式怎么办?
    mode = 'rb' 把这段内容直接用二进制的模式读入到内存中,不需要转码,硬盘怎么存的就怎么取出来
    如果mode模式是二进制打开的模式,就不需要再指定文件的编码模式了,否则还容易报错
    文件打开就是二进制的编码格式了,用二进制的模式打开场景,是因为不需要给人去阅读的,是直接给机器处理的

    【5.文件处理-智能检测编码的工具】
    在打开文件前还不知道是什么编码的,编码对应数字,不涉及文件头,一段二进制串,如果是10个字节,就永远不能是utf-8格式
    因为utf-8是3个字节,这些就是可以遵循的规律,第三方的工具箱可以动态的检测文件的可能的编码模式
    rb模式打开了文件,rb是指二进制模式,数据读到内存里直接就是bytes格式,如果想看内容,还需要手动decode
    因此在文件的打开阶段,不需要指定编码
    如果你不知道文件的编码格式怎么办呢?
    第三方库:chardet

    import chardet
    f = open('filename',mode = 'rb')
    data = f.read()
    f.close()
    result = chardet.detect(open('log',mode = 'rb').read())
    print(result)
    示例

    encoding>>编码格式

    confidence>>0.99

    language>>语言格式

    安装第三方的工具包 >>命令行pip install chardet或者pip3 install chardet
    人工智能检测都是通过机器学习

    【6.文件处理-写模式操作文件】
    如果文件特别大,用read就会把整个文件读到内存中,很容易撑爆内存
    有没有方法可以简单高效的处理文件的读取呢?比如边读边处理,循环一点一点读取文件内容

    f = open ("filename","r",encoding = "utf-8")
        for line in f:
            print(line)
    f.close()
    一次取一行

    为什么文件打印会有空行呢?
    是因为文件在read的时候就是有隐藏的" "," ",循环的时候print就会自动的给line后加上换行的字符,文件中本身就有换行符,所以就导致多换了一行

    f = open("filename", mode = "w", encoding = "utf-8")
    f.write("something")
    f.close()
    写文件

    注意:
    1.一定要注意文件的本身的编码格式
    2.文件编码格式的互相转换

    f = open("filename", mode = "wb", encoding = "utf-8")
    f.write("something")
    f.close()
    写文件的二进制格式

    w模式永远是创建一个新文件,如果之前有相同的文件名,就会对这个文件进行覆盖!清空内容后再写
    w模式一定要检测是否有重复的文件


    【7.文件处理-追加模式操作文件】

    f = open("filename", mode = "a", encoding = "utf-8")
    f.write("
    name where number")
    f.close()
    把内容追加到文件的尾部

     【8.混合操作文件】

    文件的操作可以读取,可以写入,那么是不是可读可写的呢?
    当模式就是读取的时候,文件就不能写入了,同样的,当模式就是写入的时候,也不能读取
    那怎么才能让文件既能读取又能写入呢?
    当然是有的,既能写又能读的模式--读写混合

    f = open("filename", mode = "r+", encoding = "utf-8")
    data = f.read()
    print(data)
    f.write("
    something notgood 11111111")
    f.close()
    读写混合模式

    这个模式就是既可以读取又可以写入的
    不是文件读取完了以后就可以再读一遍的,文件会先读取你的光标的位置,在最开头读取,读取直至你的文件的最后一行
    每写一行光标机会后移一次,再read就会再从光标的位置继续出发再读取

    f = open("filename", mode = "w+", encoding = "utf-8")
    data = f.read()
    print(data)
    f.write("
    something notgood 11111111")
    f.close()
    写读混合模式

    读写模式是先读后写,写读模式是以写的模式,创建的模式打开,再读取文件
    尽量不要用写读模式

    【9.文件处理-文件操作做其他功能】
    文件操作的其他方法

    def fileno(self,*args,**kwargs): 
    返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到(网络编程模块使用)
    def flush(self,*args,**kwargs):
    把文件从内存buffer(缓存)里强制刷新到硬盘
    内存的读取速度比硬盘快太多了,文件操作就具有缓存的功能,flush就是强制刷新内存的数据到硬盘
    def readable(self,*args,**kwargs):
    判断文件是否可读(Linux上一切皆文件,用来判断文件是否是正常的文件,一般用不到,mode = “w”就是不可读的)
    def realine(self,*args,**kwargs):
    只读一行,遇到
     or 
    为止
    def seek(self,*args,**kwargs):
    把操作文件的光标移到指定位置,seek取到的光标位置是根据文件的字节去找,read才是按文件的字符取读取
    注意seek的长度是按字节算的,字符编码存每个字符所占的字节长度不一样
    如“路飞学城”用gkb是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4)就把光标切换到飞
    但是如果是utf-8,seek(4)会导致拿到了“飞”这个字的一部分字节,打印的话就会报错,因为处理剩下的文本时发现用不了
    def seekable(self,*args,**kwargs):
    判断文件是否可进行seek操作,二进制文件都可以seek,Linux上有的特殊文件就是不能seek的
    def tell(self,*args,**kwargs):
    返回当前文件操作的光标位置
    def truncate(self,*args,**kwargs):
    按指定长度截断文件,从当前位置开始截断,既可以截断部分,也可以
    指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全部去掉
    def writeable(self,*args,**kwargs):
    判断文件是否可写
    常用方法
    file.isatty()
    如果文件连接到一个终端设备返回 True,否则返回 False。
    【不常用功能】

    10.文件处理-文件修改功能】
    修改文件,尝试直接以r+模式打开文件,默认会把新增的内容追加到文件的最后面,但是怎么在文件的中间部分添加内容呢?
    使用seek方法,让光标移动到文件的中间部分,就可以再之后再增加啦

    f = open("filename","r+",encoding ="utf-8" )
    f.seek(6)
    f.write("[路飞学城]")
    f.close()
    示例

    这个示例就是会覆盖文件的原数据,是不能往后移动的
    因为这个文件本身是从硬盘里读到内存的,这个文件从开始创建到结束就都已经写到硬盘里了,想要把文件中间插入内容是不行的
    这就是硬盘的存储原理,当然可以直接修改啦,除非你的文件修改的字节是一样的
    那为什么其他的word或者excel等可以修改呢
    其实他们也没有修改啦,大文件就是会把所有的数据全部加载到内存中,所以响应时间慢,全部加载内存中就可以增删改查了,然后再重新写入硬盘
    文件特别大的情况下会不会撑爆内存呢?有没有节省内存的方式呢?
    会!文件大就会内存读取不了,当然可以,就是一点一点的读取文件,边读边修改,写入一个新的文件,不占内存但是占硬盘
    重命名文件的方式
    使用OS模块
    os.rename(new_filename, old_filename)
    将新文件名替换成老文件名

    Win a contest, win a challenge
  • 相关阅读:
    Spring Boot 自定义starter
    jvm中的年轻代 老年代 持久代 gc
    nginx反向代理服务器端口问题
    ACE Editor在线代码编辑器简介及使用引导
    Linux下MySQL 5.6.24的编译安装与部署
    C3p0的参数
    Mysql 查看连接数,状态
    linux下mysql定时备份数据库
    Mysql中存储方式的区别
    mysql常用语句
  • 原文地址:https://www.cnblogs.com/pandaboy1123/p/9266310.html
Copyright © 2020-2023  润新知