文件是数据存储的单位,文件中的数据以字节为单位进行顺序存储,汉字在GBK中占2个字节,在UTF-8中占3个字节
文件的操作流程
- 打开文件
- 读/写文件
- 关闭文件
注意:任何操作系统,一个应用程序同时打开文件的数量有最大数限制的,所以要记得关闭文件
读取文件
f = open(file='mynote.txt', mode='r*', encoding=None)
参数:
- file:文件名或(相对/绝对)文件路径
- mode:"r":以只读方式打开文件(默认)
- "t":文本文件模式打开(默认)
- "b":二进制模式打开
- encoding:python默认是ASCII编码,显示中文时会做一个ASCII到系统默认编码的转换,到时候会出错,所以一定要规定编码格式
返回:文件流对象
注意:如果打开文件失败,则会触发OSError错误
try: f = open("./abc.txt") print("文件打开成功!") f.close() # 关闭文件 except OSError: print("打开文件失败!")
python 文件读写的类型有两种
文本文件(text file) 操作模式:'t'
二进制文件(binary file) 操作模式:“b”
文本文件操作:
把文件的字节码自动转换为字符串,换行符会自动转换成' ',默认文件中存储的都为字节数据,以行为单位进行分隔,在python内部统一用' '作为换行进行分隔
对文本文件读写需要用字符串(str)进行数据读取和写入
各种操作系统的换行
Linux换行符 : '
'
Window换行符 : '
'
旧的Macintosh换行符: '
'
新的Mac Os 换行符 : '
'
f.read()
从文件读取指定的字节流数,如果未给定或者为负则读取所有

# runoob.txt文件的内容是 # 1:www.runoob.com # 2:www.runoob.com # 3:www.runoob.com # 4:www.runoob.com # 5:www.runoob.com fo = open("runoob.txt", "rw+") # 打开文件 print "文件名为: ", fo.name line = fo.read(10) print "读取的字符串: %s" % (line) fo.close() # 关闭文件 # 文件名为: runoob.txt # 读取的字符串: 1:www.runo
f.readline()
从光标开始位置返回一行内容 返回是字符串格式

1 try: 2 f = open("abc.txt") 3 print("文件打开成功!") 4 s = f.readline() # 读取一行数据 5 if s != '': 6 print("读取成功,文字是:", s) 7 else: 8 print("文件内已经没有数据可读了") 9 10 s = f.readline() 11 print("第二行数据是:", s) 12 s = f.readline() 13 print("第三行数据是:", s) 14 s = f.readline() 15 if s == '': 16 print("文件内已经没有数据可读取!") 17 else: 18 print('第四行数据是', s) 19 20 f.close() 21 except OSError: 22 print("文件打开失败")

1 文件打开成功! 2 读取成功,文字是:hello 3 4 第二行数据是:world 5 6 文件内已经没有数据可读取!
f.readlines()
以列表形式返回所有行内容,换行符也会读到

1 try: 2 f = open('../exercise/info.txt') 3 L = f.readlines() # 返回所有行文字的列表 4 print(L) 5 f.close() 6 except OSError: 7 print("打开文件文件")

1 ['张三 23 45 ', '历史 23 54']
关闭文件
f.close() 关闭,释放系统资源
f = open("haha.txt","w")
f.write("hello")
如果写入的文件有内容,会清空内容再写入,如果没有.txt文件,会先创建再写入
f = open('mynote.txt', 'w') f.write('hello') f.close()
以'a'模式打开文件并写入文件 追加

1 f = open('mynote.txt', 'a') 2 f.write('world') 3 f.close()
F.writelines(lines) 将列表中的内容写入文件,内容要是字符串

1 f = open('mynote.txt', 'w') 2 L = ['我是第一行 ', '我是第二行'] 3 f.writelines(L) 4 f.close()
文件流对象是可迭代对象,迭代过程中将以换行符' '作为分隔符,实例:
1 f = open('num.txt') 2 for line in f: 3 print(line) # 打印每一行的数据
标准输入输出文件
模块名 :sys sys.stdin:标准输入文件
sys.stdin.readline() 从键盘读入一行信息,回车结束

1 import sys 2 while True: 3 s = sys.stdin.readline() 4 if len(s) < 2: 5 break 6 print("刚刚读入",len(s),"字符") 7 print("s",s)

1 dasd 2 刚刚读入 5 字符 3 s dasd
sys.stdin.read() 从键盘读入多行信息,ctrl + d 输入文件结束符

1 import sys 2 s = sys.stdin.read() 3 print(s) 4 print("程序结束")

1 dsda 2 fds 3 ^D 4 dsda 5 fds 6 7 8 程序结束
sys.stdout.wirte() (向屏幕终端打印信息) print就是默认sys.stdout.write

1 import sys 2 sys.stdout.write("hello") 3 sys.stdout.write(" ") 4 sys.stdout.write("world ")

1 hello world

1 f = open("stdout.txt",'w') 2 print(1,2,3,4,sep='#',file = f)

1 1#2#3#4
sys.stderr.write() (向屏幕终端打印错误输出)

1 import sys 2 sys.stdout.write("我是标准输出 ") 3 sys.stderr.write("我是错误输出 ")

我是错误输出
我是标准输出
标准文件不需要打开和关闭就可以使用
二进制文件操作:
二进制文件操作模式字符:'b'
默认文件中存储的是以字节为单位的数据,二进制文件操作需要用字节串进行读写
f.read() / f.readline() / f.readlines() 返回类型
对于文本文件,f.read()等函数返回为字符串(str)
对于二进制文件,f.read()等函数返回为字节串(bytes)
以二进制方式读取文件内容

1 try: 2 f = open('abc.txt', 'rb') 3 # 读取数据,常用f.read读取 4 b = f.read(5) # <<== 5 代表5个字节(bytes) 5 print(b) #b'hello' 6 b = f.read(2) 7 print(b) #b'xcexd2' 8 b = f.read() # 不加实参读取全部字节,直至文件尾 9 print(b) #b'xcaxc7xb5xdaxd2xbbxd0xd0 ' 10 f.close() 11 except OSError: 12 print("打开文件失败!")
以二进制方式读取文件内容,然后再将其转换为字符串

1 try: 2 f = open('infos.txt', 'rb') 3 # 读取数据,常用f.read读取 4 b = f.read(5) # <<== 5 代表5个字节(bytes) 5 print(b) #b'hello' 6 b += f.read(2) 7 print(b) #b'helloxe4xb8' 8 b += f.read() # 不加实参读取全部字节,直至文件尾 9 print(b) #b'helloxe4xb8xadxe6x96x87' 10 print('读取的内容转为文字后为:', b.decode('utf-8')) 11 f.close() #读取的内容转为文字后为: hello中文 12 except OSError: 13 print("打开文件失败!")
F.write()对于二进制文件需要用字节串进行操作

1 try: 2 f = open("data.bin", 'wb') 3 # 在此处需要以字节串为单位进行写操作 4 f.write(b'xe4') # '中'字的编码: e4 b8 ad 5 f.write(b'xb8') 6 f.write(b'xad') 7 f.write(b' x41x42x43') 8 f.close() 9 except OSError: 10 print("文件打开失败!")
用f.tell()方法获取文件当前的读写位置 字节单位

1 f = open('data.txt', 'rb') 2 print("当前的读写位置是:", f.tell()) # 0 3 b = f.read(5) 4 print("当前的读写位置是:", f.tell()) # 5 5 b = f.read() # 读取全部内容 6 print("文件最后的位置是:", f.tell()) # 20 7 f.close()
用F.seek(offset[,whence])方法来移动文件的读写指针位置 字节单位
-
offset -- 开始的偏移量,
-
-
大于0的数表示向文件尾开始移动偏移的字节数
- 小于0的数表示向文件头开始移动偏移的字节数
-
-
-
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;
0代表从文件开头开始算起,
1代表从当前位置开始算起,
2代表从文件末尾算起。

1 f = open('data.txt', 'rb') 2 # 方法1 3 # f.seek(5, 0) # 相对于文件头向后移动5个字节 4 # 方法2 5 # f.seek(-15, 2) # 相对于文件尾向前移动15个字节 6 # 方法3 7 b = f.read(2) # 先读取2个字节 8 f.seek(3, 1) # 相对于当前位置向后移动3个字节 9 10 b = f.read(5) 11 print(b) # b'abcde' 12 13 f.close()
清空缓冲区

1 import time 2 3 f = open('infos.txt', 'w') 4 f.write('hello') 5 f.flush() # 强制清空缓冲区 6 7 # for i in range(10000): 8 # f.write('helloooooo') 9 # time.sleep(0.01) 10 11 print("程序开始睡觉...zzz") 12 time.sleep(15) 13 print("程序睡醒了,继续执行") 14 15 f.close()
汉字在UTF-8中占3个字节,在GBK中占两个字节
编码注释:
在python源文件的第一行或第二行写入如下内容:
# -*- coding:gbk -*-
# 设置源文件编码格式为gbk
或
# -*- coding:utf-8 -*-
# 设置源文件编码格式为utf-8
作用:
告诉解释执行器,此前文件的编码是什么?