函数
功能
open
打开文件
read
读取文件
write
写文件
close
关闭文件
readline
行读取
readlines
多行读取
open方法
open方法:
打开一个文件,返回一个文件对象(流对象)和文件描述符,打开文件失败则抛异常
三步曲:创建文件,打开文件,关闭文件(好像是废话
^_^
),但是关闭文件是一个很好的习惯,否则文件描述符可能会被消耗殆尽
直接上代码:
f = open('test', 'r') #文件对象
# windows <_io.textiowrapper name="test" mode="r" encoding="cp936">
# linux <_io.textiowrapper name="test" mode="r" encoding="UTF-8">
#windows默认使用的编码与linux不同
print(f.read()) #读取文件
f.close() #关闭文件
文本访问的模式:
1.文本模式
2.二进制模式
open参数
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
open参数之file:文件对象
file:打开或要创建的文件名,不指定路径的话则表示当前路径
mode模式:
模式描述字符
功能
r
缺省模式,只读
w
只写打开,文件不存在则创建
x
创建并写入一个新文件,文件已存在则报错
a
只写打开,追加内容
b
二进制模式
t
默认模式,文本模式
+
读或写打开后,使用+来增加缺失的读或写的能力
对于IO操作来说,大致以一分为两类:
只读r
只写w,x,a
增加缺失能力
r模式: f = open('filename', 'r')
- 只读打开文件,如果使用write方法打开文件对象会跑异常
- 如果打开的文件对象不存在,则会抛FileNotFoundError异常
w模式:f = open('filename', 'w')
- 使用只写模式打开文件对象,若对文件进行读操作则会抛异常
- 如果文件对象不存在,则直接创建文件
- 如果文件对象存在,则会清空文件内容
x模式:f = open('filename', 'x')
- 打开的文件对象必须不存在,否则抛FileExistsError异常
- 创建文件,并且使用只写模式打开文件对象
a模式: f = open('filename', 'a')
- 文件存在,追加模式操作文件,并且是只写模式
- 文件不存在就会创建文件,并且使用只读模式追加操作文件
wxa模式都可以产生新文件
w不管文件存在与否,都会生成全新内容的文件
a不管文件是否存在,都能在打开的文件尾部追加
x必须要求文件事先不存在,自己要造一个新文件
文本模式:t(text模式)
字符流:将文件内容按照一定的编码规范来理解,按照字符操作。open方法
的模式模式就是rt
二进制模式:b(byte模式)
字节流:将文件按照字节理解,与编码规范无关。字节操作使用bytes类型
+模式:补充缺失的读或写权限
辅助功能:为r,w,a,x提供写或者读的功能
注意点:x模式不能单独使用,需配合以上四种模式使用
open参数之encoding:编码,仅文本模式使用
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
None表示缺省编码,依据操作系统而定:
f = open('test', 'w')
f.write('啊')
f.close()
windows下默认为GBK编码(0xB0A1),Linux下缺省UTF-8(0xE5 95 8A)
文件指针
mode=r,指针起始位置在0
mode=a,指针起始位置为EOF
>>> f = open('./files/test.txt', 'a') #test.txt文件事先不存在
>>> f.write('啊abc') #文件描述符调用write方法写入内容
>>> f.close() #关闭文件对象
>>> cat ./files/test.txt
啊abc
>>> f1 = open('./files/test.txt', 'r') #只读模式
>>> f1.read()
'啊abc'
>>> f = open('./files/test.txt', 'wb+')
>>> f.write(b'abc')
>>> print(f.tell())# 显示文件指针当前所在
3
>>> f.read() #因为文件指针在文件末尾,因此读取文件时不能读取到内容
b''
>>> f.close()
>>> f = open('./files/test.txt', 'rb+')
>>> f.read()
b'abc'
read方法
read(size=-1): size表示读取多少个字符或字节;负数或者None表示读取到EOF
>>> f = open('filename', 'w+')
>>> f.write('hello world')
>>> f.close()
>>> f = open('filename')
>>> f.read(1) #读取一个字符
>>> f.read(3) #再读取两个字符
>>> f.close()
write方法
filename = 'o:/test.txt'
f = open(filename, 'w+')
lines = ['abc', '123\n', 'magedu'] # 需提供换行符
# for line in lines:
# f.write(line)
f.writelines(lines)
f.seek(0) # 回到开始
print(f.read())
f.close()
文件的遍历
#f = open('filename', 'rt+')
with open(filename) as f:
f.write('\n'.join(map(str, range(101, 120))))
with open(filename) as f:
for line in f: # 文件对象时可迭代对象,逐行遍历
print(line.encode()) # 带换行符