用文本编辑器打开一个文件就是把一个文件读入了内存中 ,因此打开文件的操做也是在内存中的,断电即消失,因此若要保存其内容就必须点击保存让其存入硬盘中python
python解释器执行py文件的原理 :浏览器
第一阶段:python解释器启动,此时就至关于启动了一个文本编辑器服务器
第二阶段:python解释器至关于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中(小复习:pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名)网络
第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码( ps:在该阶段,即执行时,才会识别python的语法,执行文件内代码,执行到name="jack",会开辟内存空间存放字符串"jack")编辑器
总结:python解释器于文件本编辑的异同测试
相同点:python解释器是解释执行文件内容的,于是python解释器具有读py文件的功能,这一点与文本编辑器同样ui
不一样点:文本编辑器将文件内容读入内存后,是为了显示/编辑,而python解释器将文件内容读入内存后,是为了执行(执行前会识别python语法)编码
字符编码:将人输入的字符转换成计算机能识别的二进制数字的过程的定义的标准就叫字符编码。spa
字符=====(字符编码)====>二进制数操作系统
因为计算机起源于美国,因此一开始设置的字符编码只针对英文。最先的字符编码叫ASCII码,后来为了知足更多国家的文字的需求,又定制了其余的字符编码。如中国的是GBK,日本的是shift_JIS,韩国是Euc_kr等等。
ASCII码:一个Bytes表明一个字符(英文字符/键盘上的全部其余字符),1Bytes=8bit,8bit能够表示0-2**8-1种变化,便可以表示256个字符。(ASCII最初只用了后七位,127个数字,已经彻底可以表明键盘上全部的字符了(英文字符/键盘的全部其余字符)后来为了将拉丁文也编码进了ASCII表,将最高位也占用了)
GBK:2Bytes表明一个字符(一个中文)
由于每一个国家有他们本身的标准,若同时使用多种语言时,标准不一样会形成乱码,这就须要设置一个通用的万国标准,这就是Unicode和UTF-8
unicode:统一用2Bytes表明一个字符;优势是字符->数字的转换速度快,缺点是占用空间大,由于英文只需1Bytes,而他统一使用2Bytes,就会形成资源浪费及占用空间大
UTF-8:对英文字符只用1Bytes表示,对中文字符用3Bytes;优势是节省空间,缺点是:字符->数字的转换速度慢,由于每次都须要计算出字符须要多长的Bytes才可以准确表示
注:存储时,python2默认ASCII码,python3默认UTF-8,可在文件开头输入#-*-coding:utf-8-*-,来指定解释器用什么字符编码
规定:
注解:全部程序,最终都要加载到内存,程序保存到硬盘中不一样的国家使用的是不一样的编码格式,可是到内存中咱们必须兼容万国
(计算机能够运行任何国家的程序缘由在于此),因此统一且固定使用unicode。
你可能会说兼容万国utf-8也能够,确实能够,彻底能够正常工做,之因此不用是由于unicode比utf-8更高效
(uicode固定用2个字节编码,utf-8则须要计算),可是unicode更浪费空间,没错,这就是用空间换时间的一种
作法。而存放到硬盘,或者网络传输,都须要把unicode转成utf-8,由于数据的传输,追求的是稳定,高效,数据
量越小数据传输就越靠谱,因而都转成utf-8格式的,而不是unicode。
重点!:文件在内存中使用的是Unicode,若要保存到硬盘中就要通过encode存为UTF-8,硬盘中的文件是以UTF-8的形式存储的,若要调用就必须通过decode成Unicode加载到内存中
注:在文件编辑器的右下角能够选择字符编码,通常状况下默认为UTF-8
乱码的产生有两种状况:
1、一份文件包含有各国语言,若保存时用的是某个国家的标准而不是万国标准的话,其余非本国的语言的文字就会以乱码的形式被保存,之后再调用时一直为乱码,等于文件被损坏,乱码没法复原。
2、一份文件以本身国家的标准的形式保存,在调用时用了其余的标准时,由于没法加载就会产生乱码,此时的乱码经过变为原来的标准就能够恢复
结论:要避免乱码的产生,最好的方法就是以什么字符编码保存就以什么字符编码打开
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器
若是服务端encode的编码格式是utf-8, 客户端内存中收到的也是utf-8编码的二进制。
文件处理的流程为:
文件打开模式:文件句柄 = open('文件路径', '模式')
注:打开文件时,须要指定文件路径和以何等方式打开文件,打开后,便可获取该文件句柄,往后经过此文件句柄对该文件操做。
open:
1 会向操做系统发起系统调用,操做会打开一个文件
2 在python程序中会产生一个值指向操做系统打开的那个文件,咱们能够把该值赋值一个变量
回收资源:f.close() 必定要作,关闭操做系统打开的文件,即回收操做系统的资源
打开文件的模式有:
#r,文本文件:只读模式,文件不存在报错 f=open(r'aaaa.py','r',encoding='utf-8') print(f.read()) print(f.readlines()) print(f.readable()) print(f.writable()) #False f.close() #w,文本文件:只写模式,文件不存在则建立空文件,文件存在则清空 f=open('new.txt','w',encoding='utf-8') f.write('1111111\n') f.writelines(['22222\n','3333\n','444444\n']) # print(f.writable()) f.close() #a,文本文件:只追加写模式,文件不存在则建立,文件存在 f=open('new_2','a',encoding='utf-8') print(f.readable()) print(f.writable()) f.write('33333\n') f.write('44444\n') f.writelines(['5555\n','6666\n']) f.close()
"+" 表示能够同时读写某个文件
"b"表示以字节的方式操做
注:以b方式打开时,读取到的内容是字节类型,写入时也须要提供字节类型,不能指定编码
flush原理:
一、文件操做是经过软件将文件从硬盘读到内存
二、写入文件的操做也都是存入内存缓冲区buffer(内存速度快于硬盘,若是写入文件的数据都从内存刷到硬盘,内存与硬盘的速度延迟会被无限放大,效率变低,因此要刷到硬盘的数据咱们统一往内存的一小块空间即buffer中放,一段时间后操做系统会将buffer中数据一次性刷到硬盘)
三、flush即强制将写入的数据刷到硬盘
读取的进度条,或者叫滚动条的代码:
import time for i in range(10): print('#',end='',flush=True) time.sleep(0.2) else: print()
文件内光标的移动:
一: read(3):
1. 文件打开方式为文本模式时,表明读取3个字符
2. 文件打开方式为b模式时,表明读取3个字节
二: 其他的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但不管哪一种模式,都是以bytes为单位移动的
2. truncate是截断文件,因此文件的打开方式必须可写,可是不能用w或w+等方式打开,由于那样直接清空文件了,因此truncate要在r+或a或a+等模式下测试效果
上下文管理(即建立一个新文件,在源文件中读一行就在新文件中写一行)
with open('a.txt','r') as read_f,open('b.txt','w') as write_f: data=read_f.read() write_f.write(data)
循环读取每一行的内容:
with open('a.txt','r',encoding='utf-8') as f: while True: line=f.readline()#只适用于小文件 if not line:break print(line,end='')
文件的修改:
import os with open('a.txt','r',encoding='utf-8') as read_f,\ open('a.txt.swap','w',encoding='utf-8') as write_f: for line in read_f: write_f.write(line.replace('alex_BSB','BB_alex_SB')) os.remove('a.txt') os.rename('a.txt.swap','a.txt')