python_文件
文件 file
什么是文件:
1、文件是数据存储的单位
2、文件通常用来长期存储数据
3、文件中的数据是以字节为单位进行顺序存储的
文件的操作流程:
1、打开文件
2、读写文件
3、关闭文件
任何的操作系统,一个应用程序同时打开文件的数量是有最大数限制的
文件的打开函数 open
open(file,mode=‘rt’,[encoding='utf-8'])用于打开一个文件,返回此文件对应的文件流对象,如果打开失败,则会触发OSError错误!,
说明:如果不指定编码格式则默认打开的是操作系统默认的编码格式
文件关闭方法:
F.close()关闭,释放系统资源
python文件读写的类型有两种:
1、文本文件(text file)
2、二进制文件(binary file)
文本文件的操作
默认文件中存储的都为字符数据,以行为单位进行分割,在pythonn内部统一用‘\n’作为换行符进行分割
文本文件读写需要用字符串(str)进行数据读取和写入
各种操作系统的换行符:
Linux换行符 :“\n”
Windows换行符:“\r\n”
旧的Macintosh:“\r”
新的Mac OS换行:“\n”
文件中常用的方法:
f.close() 文件关闭(关闭后文件不能再读写,否则会发生ValueError错误)
f.readline() 读取一行数据,如果到达文件尾则返回空行,返回的是数据结尾会有一个“\n”符号
try: f = open("info.txt") while True: s = f.readline() if s == '': break if s[-1] == "\n":#此处解决双换行 print(">>>",s[:-1]) else: print(">>>",s)#最后一行没有“\n”符号 except OSError: print("打开文件失败!")
f.readlines(max_chars=-1) 返回每行字符串的列表,max_chars为最大字符串(或字节数)
f.read(size=-1) 从一个文件中最多读取size的字符,不管是1个中文还是1个字母都代表1
f.writelines(lines) 每行字符串的列表,没有返回值
f = open("mynote.txt","w") L = ["我是第一行\n","我是第二行"]#列表的每个元素后面要加\n换行符 f.writelines(L) f.close()
f.write(text) 写一个字符串到文件流中,返回写入的字符数
f = open("mynote.txt","w") a = f.write("hello")#把字符串写入文件的同时返回一个int类型的数,次数代表字符串的长度 print(type(a),a) # <class 'int'> 5 f.close()
f.flush() 把写入文件对象的缓存内容写入到磁盘,没有参数
import time f = open("abc.txt","w") f.write("hello")#先把文字个缓冲区,当数据大于4096个字节时,才会写入磁盘中,或则文件关闭时写入 print("程序开始睡觉")#f.flush("hello")是直接将数据写入到磁盘中的 time.sleep(5) print("程序睡醒了") f.close()
mode 模式字符的含义
"r" 以只读方式打开(默认)
"w" 以只写方式打开,删除原有文件内容,如果文件不存在,则创建
"x" 创建一个新文件,并以写模式打开这个文件,如果文件存在,则产生”FileExistsError“错误
"a" 以只写方式打开一个文件,如果有原文件则追加文件末尾
"b" 用二进制模式打开
"t" 文本文件模式打开(默认)
"+" 为更新内容打开一个磁盘文件(可读可写)
"a" 以只写方式打开一个文件,如果有原文件则追加文件末尾
"b" 用二进制模式打开
"t" 文本文件模式打开(默认)
"+" 为更新内容打开一个磁盘文件(可读可写)
"rt或tr" 缺省模式
"w+b" 可以实现二进制随机读写,当打开文件时,文件内容将被清空
"r+b" 以二进制读和更新模式打开文件,打开文件时不会清空文件内容
"r+" 以文本读和更新模式打开文件,打开文件时不会清空文件内容
文本文件的迭代读取:
open()函数返回来的文件流对象是可迭代对象
f = open("abc.txt")#f是一个可迭代对象,可以使用iter()和next()函数读取数据 for line in f:#每次读取一行,相当于line = f.readline() print(line) f.close()
标准输入输出文件:
模块名:sys
sys.stdin (默认为标准键盘输入设备)
ctrl +d 输入文件末尾标识符(linux和苹果系统下)
import sys s = sys.stdin.readline() print("从键盘读取的第一行是:",s) s = sys.stdin.read()#Ctrl+d是文件末尾的标识符,不会读取第一行的数据,因为被readline读取过了 print("read读取的信息是",s) s = sys.stdin.readlines() print("readlines读取的信息是:",s) print("程序退出")
sys.stdout (默认为屏幕终端)
sys.stderr (默认为屏幕终端)
标准文件不需要打开和关闭就可以使用
import sys a = sys.stdout.write("hello\n") print(type(a),a)#<class 'int'> 6 b = sys.stdout.write("Error\n") print(type(b),b)#<class 'int'> 6
二进制文件操作:
"b" 二进制(binary)文件操作
对于二进制文件的读写通常需要用字节串(bytes)进行操作,在二进制读写操作时,一般用read和write方法
try:#文件内容为:hello中文 f = open("abc.txt","rb")#以二进制模式打开文件 b = f.read(5) #5代表5个字节,读取二进制文件通常用read()读取 print(b)#b'hello' b =f.read(3) print(b)#b'\xe4\xb8\xad'代表中字的前两个字节 b = f.read() print(b)#b'\xe6\x96\x87',代表中的最后一个字节和文的三个字节 print("读取的内容转为文字后:",b.decode("utf8"))#文,请读取的二进制字节串转为字符串 f.close() except OSError: print("文件打开失败")
二进制文件操作方法:
f.tell() 返回当前文件流的绝对位置
f.seek(offset,whence=0) 改变数据流的位置,返回新的绝对位置
f.readable() 判断这个文件是否可读,可读返回True,否则返回False
f.writebale() 判断这个文件是否可写,可写返回True,否则返回False
f.seekable() 返回这个文件对象是否支持随机定位
f.truncate(pos=None) 减掉自pos位置之后的数据,返回新的文件的长度(字节为单位)
f.seek(偏移量,whence=相对位置)
偏移量:
1、大于0代表向文件末尾方向移动
2、小于0代表向文件头方向移动
相对位置:
0代表从文件头开始
1代表从当前读写位置开始偏移
2代表从文件尾开始偏移
问题:十个汉字占多少字节?
答案:GBK占20个字节,UTF-8占30个字节
汉字编码:
国标系列:(Windows中常用)
GB18030(二字节或四字节编码)
GBK(二字节编码)
GB2312(二字节编码)
国际标准:(Linux、Mac OS X 、IOS、Android常用)
Unicode(2/4字节)
UTF-8(1-6字节)
python 编码(encode)字符串
"gb2312"
"gbk"
"gb18030"
"utf-8"
"ascii"
...
编码注释:
在源文件的第一行或第二行写入如下内容为编码注释
# -*- coding:gbk -*-
#设置原文件编码为:gbk
或:
# -*- coding:utf-8 -*-
设置源文件编码为:utf-8