python的super super easy教程 | python文件操作

python文件操作:

文件是存放在外部介质 (如硬盘、U盘) 上的一组完整信息的集合。这些信息可为各种文字、
图形、图像、电影、音乐,甚至包括病毒程序等

两种重要的文件类型
• 文本文件(Text File)。文本文件是可直接阅读的,使用记事本打开即可看到文件的内
容。
• 二进制文件(Binary File)。这类文件将数据按照它的进制编码的形式存储。如BMP。
由于这类文件内容是二进制编码,使用记事本打开是显然是乱码,BMP可用图片查看器解码。

文本:
    优点:输出内容友好,不需要手动转换
    缺点:一个字符占一个字节,文件占用的存储空间较多,读写时需要转换(内存->显示),访问的时效率不高

二进制:
    优点:二进制文件中的数据与数据的内存中的表现形式一致。二进制文件在存储数据时非常紧凑,占用存储空间较少;在读写时不需要进行转换,具有较高的时间效率
    缺点:二进制文件无法直接以字符形式输出,必须要经过一个转换过程

无论什么类型的文件,在硬盘/内存=> 二进制

计算机是只能识别二进制
二进制是机器的语言 文字是人类的语言
人类想要操控计算机,这其中就会有一个转换的过程

编码 -- (相当于人类的语言和二进制的单词表)人类语言与机器语言的映射关系
ASCII码:只是对英文字符进行编码(a是97 A是65)
unicode编码:万国码 基本上所有的文字都给一个编码
用ord(字符)查看编码

python2中默认编码ascii码
python3中默认编码是utf-8

utf-8 utf-16 utf-32 gbk 都是unicode的具体实现方式
utf-8 一个英文字符是占用一个字节 一个中文字符是占用三个字节
gbk(ISO-8859是国际上的叫法)(国标编码 对中文比较友好) 一个字符占用2个字节 如果中文比较多 就是用gbk

encode():加码函数 str转化为bytes  bytes是存储在磁盘上的二进制表示是什么样子
str1="中文"
str.encode("utf-8")  表示以utf-8存储在磁盘上的二进制表示是什么样子
str.encode("gbk")    表示以gbk存储在磁盘上的二进制表示是什么样子

decode():bytes--str 解码函数 以什么方式加码 就用什么方式解码

如果文件加码和解码的方式不一致,就会出现乱码的情况

文件的基本概念:
文件的缓冲机制:
    读操作:不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据
    写操作:不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘
    文件缓冲区:计算机系统为要处理的文件在内存中单独开辟出来的一个存储区间,在读写该文件时,做为数据交换的临时“存储中转站”
    好处:提高速度

文件的基本操作:
    打开文件(open):
    • file : 要打开的文件名( str )(绝对路径和相对路径)
    • mode: 打开文件的方式( str ) => text, bytes
    • encoding: 文件编码方式(str)
    • errors: 当发生编码错误时的处理方式(str)'ignore'或'strict'(默认)
    • buffering: 缓存方式 ( int)

python3字符串类型:
    bytes:
    str:

(Linux命令):
iconv -f utf-8 -t gbk 文件: 将该文件的内容从utf-8转换为gbk输出,源文件内容不变
file 文件名:查看文件的编码编码方式

encoding:(如果不设定的话 默认情况为encoding=None 默认为系统的默认编码 表示系统是什么编码这里就使用什么编码)
制作两个文件,一个utf-8编码,一个gbk编码
vim utf-8.txt  python3默认编码方式为utf-8
file utf-8.txt
vim gbk.txt 这还是一个utf-8的文件
iconv -f utf-8 -t gbk >gbk2.txt 得到了gbk的文件gbk2.txt
fp=open("utf-8.txt",encoding="gbk")
fp.read() 这样才能够将gbk文件正常输出

mode:(默认情况是 mode='r' 默认打开方式是只读)
文件的打开方式:读 读写 追加写 覆盖写
文件类型的打开方式:二进制类型 文本类型

fp=open("text.txt") 默认已只读方式打开
fp.read()
fp.write("内容") 报错 没有写入功能
fp=open("text.txt",“w”) 用覆盖写的方式打开
fp.read()
fp.write("内容") 已经写入了 但是还在缓冲区 查看txt文件里面没内容
fp.close()  关闭这个文件 把缓冲区里面的内容加载 查看txt文件里才是我们的最新内容
或者 fp.flush() 也可以强制加载缓冲区的内容而不关闭这个文件


打开方式 截图ppt!!!!
打开文件-mode(rwxa任选其一, tb任选其一,+是可选项)
r 只读
w 覆盖写 会覆盖原来的内容
x 新建写 如果已经存在文件会报错
a 追加写
b 二进制模式打开
t 文本模式(本来就是默认的默认)
+ 读写


python3读取文件:
fp=open("utf-8.txt")
fp.read() 能够正常打开utf-8的文件
fp=open("gbk.txt")
fp.read() 报错显示目前解码方式不支持此文件的输出
fp=open("utf-8.txt",encoding="gbk")
fp.read() 这样才能够将gbk文件正常输出

python里面查看文件编码:
在交互式环境使用需要Linux命令行安装chardet模块 :pip3 install chardet
import chardet
fp=open("utf-8.txt","rb")使用此模块必须要以二进制读的方式打开
chardet.detect(fb.read()) 显示出来的encoding是此文件的编码方式

使用with语句去管理文件打开:
(自动实现fp文件连接的关闭,实现这部分资源的回收!!!!)
open函数返回的对象是文件打开对象,这个对象是一个上下文管理器对象
只要是一个上下文管理器对象都可以使用with语句去管理
open()语句得close() 释放连接文件的资源
而with语句可以自动关闭:
with open("test.txt","a") as fp:
    fp.write("append str")
这一段代码运行完 文件已经被关闭了

buffering:缓存设置
文件的读写--读缓存--写缓存
以写缓存为例:
    默认什么时候会将缓存写入磁盘?
        1.fp.close()文件连接关闭的时候
        2.fp.flush()执行flush强制将缓存刷新到磁盘
        3.缓冲区满的时候将文件内容刷新到磁盘
        4.程序退出的时候

    python中写缓冲的方式是可以通过buffering参数去设置的
    buffering参数是设置成0~n的整数的
    0: 实时写入 不缓存  只适用于二进制模式
    1: 行缓存 只要遇到换行符就写入磁盘 只适用于文本模式
    2~n: 例如n为2  表示设置缓冲区的大小 2*4096个字节

二进制字符串需要在前面加一个b标志位:如 b'this is test'

图片是二进制存储的

读取文件的内容命令:
fp.read() 返回当前到文末(字符串),可指定字符数(默认是读取到文末)
    如 fp.read(10):从光标位置向后读取10个字符(字符不是字节 一个中文字符也是一个字节)
fp.readlines() 返回当前光标到文末的内容 返回一个列表(每行一个元素)
fp.readline() 返回光标位置到行末(一行一行输出)(字符串) 读取过的不会再读

每次用一种方式读完都需要重置光标
重置光标 fp.seek()
    f.seek(cookie, whence)
    cookie=> 偏移量 向前移动就是负数 向后移动就是正数
    whence=> 相对位置(0-> 开始, 1->当前, 2->末尾)(默认为0)
    注意:1、2只能用b模式打开才可以
    如:fp.seek(0) 把光标位置回到最开始的位置

fp.tell()返回当前光标的位置

文本文件后面默认为一个换行符

for i in fp:(遍历这个文件的每一行)

对于大文件的读写:
不要使用默认的read  最好不要用read和readlines
这两个方式会一次性的将文件内容全部读入内存,可能会造成OOM
推荐使用:
(一行一行读,一行一行进行计算使用 这一行读完了就可以在内存里删掉了)
    for i in fp:
        pass
但是一行一行读,虽然内存空间问题得到了解决,但是效率不高

可不可以一次性读取多一点的数据呢?
fp.read(6000) 输出6000个字符(1个中文字就是一个字符)
fp.readlines(6000) 输出6000个字符所在的行

你可能感兴趣的:(python的super,super,easy教程,python,开发语言,后端)