路飞学城Python-Day6

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的时候就是有隐藏的"\t","\n",循环的时候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("\nname where number")
f.close()
把内容追加到文件的尾部

 【8.混合操作文件】

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

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

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

f = open("filename", mode = "w+", encoding = "utf-8")
data = f.read()
print(data)
f.write("\nsomething 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):
只读一行,遇到\r or \n为止
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)
将新文件名替换成老文件名

猜你喜欢

转载自www.cnblogs.com/pandaboy1123/p/9266310.html