day3_文件操作
对文件的操作:
1、打开文件获取文件的句柄,句柄就理解为这个文件
2、通过文件句柄操作文件
3、关闭文件。
一、open函数
1、语法:
file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
- file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
- access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
- buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
二、模式说明:
r:以只读方式打开文件。文件指针会放在文件的开头。这是默认模式,打卡文件不存在的话,会报错
w: 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a: 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
w+:打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
r+:打开一个文件用于读写。文件指针将会放在文件的开头。
a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
wb: 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
其他说明:
1、w+模式,read()方法会清空文件
f = open('users.txt','w+',encoding='utf-8') #w+模式打开文件 print(f.read()) #读不出来任何内容,反而会把文件中内容清空
2、r+模式,先读后写,没有将前面内容清空,因为指针读完在最后
f = open('users.txt','r+',encoding='utf-8') #w+模式打开文件 print(f.read()) #读完指针在最后 f.write('AAA') #前面内容么有清空,在文件后面填上了AAA
三、常用方法汇总(牛牛杂货铺):
f = open('file.txt','r+',encoding='utf-8')#encoding参数可以指定文件的编码
1、 flush() 方法
是用来把文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区。
一般情况下,文件关闭后会自动刷新到硬盘中,但有时你需要在关闭前刷新到硬盘中,这时就可以使用 flush() 方法。
语法
flush() 方法语法如下:
fileObject.flush()
参数:无
返回值:没有
2、close()方法
新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
3、write()方法
用于向文件中写入指定字符串。
在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not 'str'。
write()方法不会在字符串的结尾添加换行符('\n'):
语法:fileObject.write( [ str ])
参数:str -- 要写入文件的字符串。
返回值:返回的是写入的字符长度。
f = open('users.txt','w+',encoding='utf-8') #打开文件 print(f.write('加入')) #返回写入的字符串长度 f.seek(0) #w+将原内容清楚,写入,指针在最末尾,所以移到最前面才能读出来 print(f.read())
结果:
2
加入
4、writelines()
用于向文件中写入一序列的字符串。(元素必须是字符串)
这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
换行需要制定换行符 \n。
语法
writelines() 方法语法如下:
fileObject.writelines(iterable)
参数:iterable -- 可迭代对象(字符串、列表、元祖、字典)。
返回值:没有返回值
f = open('users.txt','a+',encoding='utf-8') #打开文件 str1 = 'abc\n' list1 = ['a','b','c','\n'] tupl1 = ('a','b','c','\n') dict1 = {'a':1,'b':2} res = f.writelines(str1) #迭代写入字符串字符 res = f.writelines(list1) #迭代写入列表元素 res = f.writelines(tupl1) #迭代写入元组元素 res = f.writelines(dict1) #迭代写入字典的key f.seek(0) print(f.read())
结果:
abc
abc
abc
ba
如果序列中不是字符串
f = open('users.txt','a+',encoding='utf-8') #打开文件 list2 = [1,2,3] tupl2 = (1,2,3) dict2 = {1:1,2:2} res = f.writelines(list2) res = f.writelines(tupl2) res = f.writelines(dict2)
结果报错:TypeError: write() argument must be str, not int
5、read()方法
从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
语法:fileObject.read( size );
参数:size -- 这是从文件中读取的字节数。
返回值:此方法返回读取的字节数的字符串形式
f = open('users.txt') #打开相对目录下文件,默认模式r print(f.read()) #可以读出users.txt里的全部内容
f = open('users.txt',encoding='utf-8') #如果文件里有中文,写上encoding='utf-8 print(f.read())
f = open(r'E:\nhy\users.txt.txt',encoding='utf-8') #打开文件如果写相对路径,在路径前面加个r(声明字符串不需要转义) print(f.read())
6、readline()
方法用于从文件读取整行,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字符数,包括 "\n" 字符。
语法
readline() 方法语法如下:
fileObject.readline([size])
参数:size -- 从文件中读取的字符数。
f = open(r'E:\nhy\users.txt.txt',encoding='utf-8') #打开文件如果写相对路径,在路径前面加个r(声明字符串不需要转义) print(f.readline()) #第一行被打印出来 print(f.readline()) #第二行被打印出来
输出结果:
111 22222222
备注:源文件中111与22222222之间没有空行,但是为什么打印出空行来了呢?
原因:python 中print()非常友好,会自动读取换行符打印换行,
>>> f = open(r'E:\nhy\users.txt.txt',encoding='utf-8') >>> f.readline() #没有print,输的字符串中包含换行符 '111\n' >>> f = open(r'E:\nhy\users.txt.txt',encoding='utf-8') >>> print(f.readline()) #print()会非常友好,将换行符自动当换行符使用了,所以111下面出了一行空行
111
7、readlines()
用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。 如果碰到结束符 EOF 则返回空字符串。
如果碰到结束符 EOF 则返回空字符串。
语法:fileObject.readlines()
参数:无
返回值:返回列表,包含所有的行。
f = open('users.txt',encoding='utf-8') #打开文件 print(f.readlines()) #返回列表
输出结果:
['test1,123456\n', 'test2,34545\n', '联系,23424']
8、seek() 方法
用于移动文件读取指针到指定位置。
语法:fileObject.seek(offset[,whence])
参数说明:
offset -- 偏移量,也就是代表需要移动偏移的字节数,注意是按照字节算的,字符编码存每个字符所占的字节长度不一样。
如“路飞学城” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“飞”和“学”两个字中间。
但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节。
whence:可选,默认值为 0。表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
实例:
f = open('user.txt','w+')
f.write('alsdkjfklasdf')
f.seek(0) #写完之后,指针在最末尾,需要把指针放到最前面才能读出来全部内容
print(f.read())
f.close()
输出:
alsdkjfklasdf
9、replace() 方法
Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
语法:str.replace(old, new[, max])
参数:
- old -- 将被替换的子字符串。
- new -- 新字符串,用于替换old子字符串。
- max -- 可选字符串, 替换不超过 max 次
返回值:返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次。
str1 = 'abc' res = str1.replace('abc','ABC') #替换字符串中的abc为ABC,返回一个新字符串 print(res) #打印新字符串
结果:
ABC
四、with使用:
在操作文件的时候,经常忘了关闭文件,这样的就可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件,注意with下面的语句需要缩进,使用方式如下:
举例1:
1 with open('file_test','r',encoding='utf-8') as f: 2 print(f.tell()) #获取file_test文件指针指向 3 print(f.readline()) 4 print(f.tell())
举例2:
1 with open('file_test','r',encoding='utf-8') as f: #打开一个文件,把这个文件的句柄付给f 2 for line in f: 3 print(line)
举例3:
1 with open('file_test','r',encoding='utf-8') as fr,open('file_test_bat.txt','w',encoding='utf-8') as fw:#多个文件操作,读file_test文件,写入file_test_bat文件,file_test_bat没有自动创建 2 for line in fr:#循环每一行 3 fw.write(line)#写到file_test_bat文件中 4 with open('file_test_bat.txt','r',encoding='utf-8') as fw:#读一下复制出来的文件 5 print(fw.read())
五、二进制模式文件 模式后面加上b
f = open('Chrysanthemum.jpg','rb') print(f.read())
使用strip()函数去掉每行结束的\n
例如:
1)
for line in file.readlines():
line=line.strip('\n')
2)
#读取 ip地址文件 写入 ip_address 列表
ip_address = []
with open('ip.txt', 'r') as f1:
for ip in f1.readlines():
if ip != None:
# 从文件中读取行数据时,会带换行符,使用strip函数去掉 换行符后存入列表
ip_address.append(ip.strip("\n"))
f1.close()