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:
 with open('file_test','r',encoding='utf-8') as f:
     print(f.tell())           #获取file_test文件指针指向
     print(f.readline())
     print(f.tell())
举例2:
 with open('file_test','r',encoding='utf-8') as f: #打开一个文件,把这个文件的句柄付给f
     for line in f:
         print(line)
举例3:
 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没有自动创建
     for line in fr:#循环每一行
         fw.write(line)#写到file_test_bat文件中
 with open('file_test_bat.txt','r',encoding='utf-8') as fw:#读一下复制出来的文件
     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()
day3_文件操作的更多相关文章
- 【.NET深呼吸】Zip文件操作(1):创建和读取zip文档
		.net的IO操作支持对zip文件的创建.读写和更新.使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办. 要对zip文件进行操作,主要用到以下三个类: 1.ZipFile ... 
- 野路子出身PowerShell 文件操作实用功能
		本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ... 
- Node基础篇(文件操作)
		文件操作 相关模块 Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包 fs: 基础的文件操作 API path: 提供和路径相关的操作 ... 
- 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)
		========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ... 
- SQL Server附加数据库报错:无法打开物理文件,操作系统错误5
		问题描述: 附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf ... 
- 通过cmd完成FTP上传文件操作
		一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ... 
- Linux文件操作的主要接口API及相关细节
		操作系统API: 1.API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用,应用层程序通过调用API来调用操作系统中的各种功能,来干活 文件操作的一般步骤: 1.在linux系统 ... 
- C语言的fopen函数(文件操作/读写)
		头文件:#include <stdio.h> fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为: FILE * fopen(const char * path, c ... 
- Python的文件操作
		文件操作,顾名思义,就是对磁盘上已经存在的文件进行各种操作,文本文件就是读和写. 1. 文件的操作流程 (1)打开文件,得到文件句柄并赋值给一个变量 (2)通过句柄对文件进行操作 (3)关闭文件 现有 ... 
随机推荐
- 如何让vue文件中的代码在Sublime Text 3中高亮和智能提示
			大家写在Sublime Text 3中编写vue文件时,会发现没有代码智能提示,清一色的黑底白字,不会像html.js一样变成彩色,给我们带来了很大的不便.所以需要安装一款叫作Vue Syntax H ... 
- pdf 移除密码  去除水印 批量去除水印  编辑文字  批量替换文字
			1.pdf除密码: http://pan.baidu.com/share/link?shareid=308194398&uk=370045712 2.去除水印:http://wenku.ba ... 
- 小米手机安装mitmproxy证书
			[本文出自天外归云的博客园] 问题描述 小米手机在连接mitmproxy代理后通过浏览器访问mitm.it下载android证书后无法成功安装证书 设备:Redmi Note 2(红米手机) 解决方法 ... 
- Guava Lists.transform踩坑小记<转>
			1.问题提出 1.前段时间在项目中用到Lists.transform返回的List,在对该list修改后发现修改并没有反映在结果里,研究源码后发现问题还挺大.下面通过单步调试的结果来查看Guava L ... 
- Java知多少(29)覆盖和重载
			在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ... 
- laravel5.4 表单提交
			1.路由配置: Route::post('/posts', '\App\Http\Controllers\PostController@store'); 2.防止csrf攻击 @section('co ... 
- Markdown 引用
			Markdown 使用 > 来标记区块引用,语法及效果如下: > 这是第一级引用 > > > 这是第二级引用 > > 现在回到第一级引用 > > ... 
- Kafka ACL使用实战
			自0.9.0.0.版本引入Security之后,Kafka一直在完善security的功能.当前Kafka security主要包含3大功能:认证(authentication).信道加密(encry ... 
- 关于git CRLF LF结尾的问题
			在使用git的过程中,如果我们的项目是跨平台开发的 那么CRLF的处理也许会成为一个很头疼的事情,有可能会出以下的莫名其妙的问题: 我们的某个开发人员在linux上提交的一个文件 当从windows上 ... 
- Error running app: Default Activity Not Found
			最近在调试安装Android Widget程序时,碰到Error running app: Default ActivityNot Found. 因为简单的Widget程序,如果不和应用程序关联,就不 ... 
