在python中无论是从文件中读取内容还是写入内容都需要打开文件,打开文件使用的是内置函数open,open函数中有许多参数,open中只有file是必须参数,其中常用的就是file、mode和encoding三个参数,open函数定义如下:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline =None, colsefd=True, opener=None)
- 文件模式
模式 | 描述 |
r | 以只读方式打开文件,文件指针将会放在文件的开头,这是默认模式 |
rb | 以二进制格式打开一个文件用于只读,文件指针放在文件的开头 |
r+ | 打开一个文件用于读写,文件指针将会放在文件的开头,如果文件不存在则报错 |
rb+ | 以二进制格式打开一个文件用于读写,文件指针将会放在开头,如果文件不存在则报错 |
w | 打开一个文件,只用于写入。如果文件已存在,则覆盖原有的内容;如果不存在则新建文件 |
w+ | 打开一个文件用于读写。如果文件已存在,则覆盖原有的内容;如果不存在则新建文件 |
wb | 以二进制的形式打开一个文件,用于写入。果文件已存在,则覆盖原有的内容;如果不存在则新建文件 |
wb+ | 以二进制的形式打开一个文件,用于读写。如果文件已存在,则覆盖原有的内容;如果不存在则新建文件 |
a | 打开一个文件用于追加内容。如果该文件已存在,则文件指针会放在文件的结尾,新内容追加在已有内容之后;如果文件不存在,则新建文件 |
a+ | 打开一个文件用于读写。如果该文件已存在,则文件指针会放在文件的结尾,新内容追加在已有内容之后;如果文件不存在,则新建文件 |
ab | 以二进制的形式打开一个文件,用于追加内容。如果该文件已存在,则文件指针会放在文件的结尾,新内容追加在已有内容之后;如果文件不存在,则新建文件 |
ab+ | 以二进制的形式打开一个文件,用于读写。如果该文件已存在,则文件指针会放在文件的结尾,新内容追加在已有内容之后;如果文件不存在,则新建文件 |
- 读取文件
新建test.txt文件,写入内容
hello world
hello python
how are you
i'm fine
thanks
常用方法:
- read(byte):不加参数默认读取文件所有内容,byte读取多少内容,以b为单位
- readline():读取一行内容
- readlines():返回文件内容列表,每一行作为列表的元素
f = open('./test.txt', 'r')
#读取1kb内容
txt = f.read(1024)
print(txt)
'''
hello world
hello python
how are you
i'm fine
thanks
'''
f.close()
#读取一行(每读取一行,文件指针移动到下一行开头)
f = open('./test.txt', 'r')
print(f.readline()) #hello world
print(f.readline()) #hello python
f.close()
#使用readlines遍历文件内容
f = open('./test.txt', 'r')
for line in f.readlines():
print(line)
'''
hello world
hello python
how are you
i'm fine
thanks
'''
- 写入内容
常用方法:
- write():向文件中写入内容
- writelines():方法接收一个列表作为参数,列表中每一个元素作为一行写入文件中,但是在writelines不会自动添加换行符,需要手动添加换行符才能实现按行写入
f = open('writeme.txt', 'w')
#写入内容
f.write('hello python')
#按行写入
list1 = ['hello\n', 'world\n']
f.writelines(list1)
f.close()
- 利用二进制读写实现图片的复制
f1 = open('1.jpg', 'rb')
jpg = f1.read()
f2 = open('2.jpg', 'wb')
f2.write(jpg)
f1.close()
f2.close()
- python中的with...as...语句:
在python中with适用于对I/O、文件流、数据流等资源进行访问的场合,确保不管使用过程中是否发生异常,都会执行必要的清理操作,释放资源。比如:文件使用后自动关闭、线程中锁的自动获取和释放等等。
使用with...as...简化复制图片的例子
with open('1.jpg', 'rb') as f1:
with open('2.jpg', 'wb') as f2:
f2.write(f1.read())
- StringIO和BytesIO
有时候数据并不需要真正写入到文件中,只需要在内存中做读写即可,StringIO和BytesIO把文件保存在内存中,StringIO的操作对象是字符串,如果要操作二进制数据,就需要用到BytesIO。操作和普通文件几乎一样,多了个获取内容的方法getvalue()
from io import StringIO, BytesIO
f1 = StringIO() #创建一个空白的StringIO
f1.write('hello')
f1.write(' ')
f1.write('python')
print(f1.getvalue()) #读取f1对象的内容 hello python
f2 = StringIO('hello\nworld\nwelcome') #创建StringIO的同时写入内容
while True:
s = f2.readline()
if s == '':
break
print(s)
'''
hello
world
welcome
'''
f1.close()
f2.close()
f3 = BytesIO() #创建一个空白的StringIO
f3.write('你好'.encode('gbk'))
print(f3.getvalue()) #b'\xc4\xe3\xba\xc3'
print(f3.getvalue().decode('gbk')) #你好
f4 = BytesIO(b'\xc4\xe3\xba\xc3') #创建ByteIO的同时写入内容
print(f4.getvalue().decode('gbk')) #你好