- 什么是文件
文件是数据存储的单位
文件通常用来长期存储数据
文件中的数据是以字节为单位进行顺序存储的 - 文件的操作流程
1.打开文件
2.读写文件
3.关闭文件
任何的操作系统,一个应用程序同时打开文件的数量有最大数限制 - 文件的打开函数 open
open(file,mode='rt')用于打开一个文件,返回此文件对应的文件流
对象,如果打开失败,则会OSError错误
- 文件的关闭方法:
F.close() 关闭,释放系统资源
示例:
#Python没有文件错误相关的机制,不像C语言返回0
#故执行文件操作一定要进行异常处理
try:
#f = open('/etc/passwd') #文件能成功打开
f = open('/root/abc.txt') #此文件不存在
print('文件打开成功')
except OSError: #OSError包含一系列文件相关的异常
print('文件打开失败')
-
python文件读写的类型有两种:
文本文件(text file)
二进制文件(binary file) -
文本文件的操作
默认文件中存储的都为字符数据,以行为单位进行分隔,在python内部统一用‘\n’作为换行进行分隔
对文本文件读写需要用字符串(str)进行数据读取和写入 -
各种操作系统的换行符:
Linux换行符: '\n' Windows换行符: '\n\r' 旧的Macintosh换行符: '\r' 新的Mac Os换行符: '\n'
-
文件当中常用的方法:
F.readline() #读取一行数据,如果到达文件尾则返回空行
F.readlines() #返回每行字符串的列表
F.read(size=-1) #从文件流中最多读取size个字符,类似readline
F.writelines(lines) #将多行文本读入文件内,lines可为list等
F.flush() #强制清空缓冲区,能使内容不足磁盘块也写入磁盘
#二进制文件操作方法
F.tell() #返回当前文件的读写位置
F.seek(offset,whence=0) #改变数据流的位置,返回新的绝对位置
-
文件的模式字符:
'r' 以只读方式打开(默认) 'w' 以只写方式打开,删除原有文件内容(如果文件不存在,则创建) 'x' 创建一个新文件,并以写模式打开,如果文件存在则有FileExistsError错误 'a' 以只写文件打开一个文件,如果有文件则追加到文件尾 'b' 以二进制模式打开 't' 文本模式打开(默认) '+' 为更新内容打开一个磁盘文件(可读可写) 缺省模式是:'rt' 'w+b'可以实现二进制随机读写,当打开文件时,文件内容将被清零 'r+b'以二进制读和更新模式打开文件,打开文件时不会清空文件内容 'r+' 以文本模式读和更新模式打开文件,打开文件时不会清空文件内容
示例1:
#此示例readline()用法:
def read_text_date():
try:
f = open('info.txt')
#print('文件打开成功')
while True:
s = f.readline()
if s != '':
if s[-1]=='\n': #readline会默认将末尾
print(s[:-1]) #的\n同时打印,不做处理
else: #会出现换两次行
print(s)
else:
print('文件内没有内容')
break
f.close()
except OSError:
print('文件打开失败')
示例2:
#示意f.writelines()的用法
f = open('abc.txt','w')
L = ['我是第一行\n','我是第二行']
f.writelines(L)
f.close()
- 文本文件的迭代读取
open函数返回来的文件流对象是可迭代对象
示例:
f = open('abc.txt')
#每次取出一行,相当于line = f.readline()
for line in f:
print(line)
f.close()
- 标准输入输出文件
模块名:sys
sys.stdin(默认为 标准键盘输入设备)
ctrl + d 为文件末尾标识符(linux,mac)
sys.stdout(默认为屏幕终端)
sys.stderr (默认为屏幕终端) - 二进制文件操作:
'b’二进制文件操作
对于二进制文件的读写通常需要用字节串(bytes)进行操作 - F.seek()方法(二进制文件操作)
F.seek(偏移量,whence=相对位置)
偏移量:
大于0代表向文件末尾方向移动
小于0代表向文件头方向移动
相对位置:
0 代表从文件头开始
1 代表从当前读写位置开始偏移
2 代表从文件尾开始偏移
示例:
#此程序示意从文件第5个位置开始读出5个字节(文件一共20个字节)
try:
f = open('bin.txt','rb')
print('当前的读写位置是:',f.tell())
f.seek(5,1) #相当于f.seek(-15,2)
print('当前的读写位置是:',f.tell())
s = f.read(5).decode('utf-8')
print(s)
f.close()
except OSError:
print('文件打开错误')
-
汉字编码
-
一个汉字占多少个字节?
GBK占2个字节(Windows)
UTF-8占3个字节 -
系列标准:
国际系列: GB18030(二字节或四字节编码) GBK(二字节编码)中国95年的标准,繁体简体字体 GB2312(二进制编码)中国80年的标准,6000多个汉字 (Windows常用)从下至上依次被包含 国际标准: UNICODE <--------> UTF-8(1~6字节) (Linux / Mac OS X / IOS / Android常用)
- python2与python3字符串与字节串编码区分:
python2的字符串其实更应该称为字节串。 在python2里,bytes == str ,
除此之外, python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode。
Python3 除了把字符串的编码改成了unicode, 还把str 和bytes 做了明确区分,
str 就是unicode格式的字符, bytes就是单纯二进制。
在py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。
- python3字符串编码(encode)
'gb2312'
'gbk'
'gb18030'
'utf-8'
'ascii'
- 编码注释:
在源文件的第一行或第二行写入如下内容为编码注释
# -*- coding:utf-8 -*-
#设置源文件编码为:utf-8
#-*- coding:gbk -*-
#设置源文件编码为:gbk,这样才能在windows上显示中文字符
- 总结
python3 文件默认编码是utf-8 , 字符串编码是 unicode
以utf-8 或者 gbk等编码的代码,加载到内存,会自动转为unicode正常显示。
python2 文件默认编码是ascii , 字符串编码也是 ascii , 如果文件头声明了是gbk,那字符串编码就是gbk。
以utf-8 或者 gbk等编码的代码,加载到内存,并不会转为unicode,编码仍然是utf-8或者gbk等编码。