文件 file
什么是文件:
1, 文件是数据存储的单位
2, 文件通常用来长期存储数据
3, 文件中的数据是以字节为单位进行顺序存储的
文件的操作流程:
1, 打开文件
2, 读写文件
3, 关闭文件
任何的操作系统, 一个应用程序同时打开文件的数量是有最大数限制的
文件的打开函数 open
open(file,mode='rt')用于打开一个文件, 返回此文件对应的文件流对象, 如果打开失败, 则会触发 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()
- View Code
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("文件打开失败")
- View Code
二进制文件操作方法:
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
来源: http://www.bubuko.com/infodetail-2693794.html