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参数可以指定文件的编码

            f.readline()#读一行
            f.readable()#判断文件是否可读
            fr.writable()#判断文件是否可写
            fr.encoding#打印文件的编码
            f.read()#读取所有内容,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
            f.readlines()#读取所有文件内容,返回一个list,元素是每行的数据,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
            f.tell()#获取当前文件的指针指向
            f.seek(0)#把当前文件指针指向哪
            f.write('爱情证书')#写入内容
            f.fulsh()#写入文件后,立即从内存中把数据写到磁盘中
            f.truncate()#清空文件内容
            f.writelines(['爱情证书','孙燕姿'])#将一个列表写入文件中
            f.close()关闭文件

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()
 



 

posted on 2018-08-30 20:47  羽竹  阅读(218)  评论(0编辑  收藏  举报