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)
将新文件名替换成老文件名

路飞学城Python-Day7的更多相关文章

  1. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. 路飞学城-Python开发集训-第1章

    学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...

  6. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  7. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  8. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...

  9. 路飞学城-Python开发-第三章

    # 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...

  10. 路飞学城-Python开发-第一章

    # 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...

随机推荐

  1. ZBrush通过遮罩得到子物体

    ZBrush 中通过遮罩为模型添加子物体的方法简单且方便,我们可以通过按住Ctrl键绘制遮罩结合相关命令创建具有抽出厚度的模型提取出作为子物体附在模型表面.本文将详细介绍在Zbrush中如何通过遮罩得 ...

  2. SVG矢量动画

    一.概述 相较于png.jpg等位图通过存储像素点来记录图像,svg (Scalable Vector Graphics)拥有一套自己的语法,通过描述的形式来记录图形.Android并不直接使用原始的 ...

  3. easyUI combobox的使用

    1.需要用到的方法 设置组合框(combobox)值的数组. $('#cc').combobox('setValues', ['001','002']); 设置组合框(combobox)的值. $(' ...

  4. Cookie和Session有什么区别

    1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是Session.   典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状 ...

  5. HDU 1757 A Simple Math Problem( 矩阵快速幂 )

    <font color = red , size = '4'>下列图表转载自 efreet 链接:传送门 题意:给出递推关系,求 f(k) % m 的值, 思路: 因为 k<2 * ...

  6. JavaString库

    String库 .length() 字符串的长度,一个字符串为空(空字符串对象)和null(不指向任何对象)是两个概念,中文字符和英文字符是一样的计数(一个中文是一个字符,一个英文字母是一个字符) . ...

  7. Maven系列--web.xml 配置详解

    一 .web.xml介绍 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 紧接着,容 ...

  8. 洛谷 P2700 逐个击破

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,毛主席制 ...

  9. HDU 2841

    明显,当(X,Y)=1时,是可以看见的. 这题,记得POJ 上也有类似的一题... 不过比较奇怪的是,我以为会超时,因为范围达到了100000,但竟然直接枚举没超时.... #include < ...

  10. 推断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式

    第一个版本号: //return true in big-endian machines bool check_big_endian1() { int a = 0; int *p = &a; ...