Python学习笔记015——文件file的常规操作之一(文本文件)
1 什么是文件
文件是用于数据存储的单位
文件通常用来长期保存数据
读写文件是最常见的I/O操作。Python内置了读写文件的函数,用法和C是兼容的。
读写文件的功能都是由操作系统提供的,一般而言,操作系统不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),再通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个对象(写文件)。
2 文件的打开和关闭的基本规则
文件需要在使用时先打开才能读写
在不需要读写文件后,应及时关闭文件以释放系统资源
任何操作系统对打开的文件数有最大数限制
2.1 文件的打开 open()
f = open('/Users/michael/test.txt', 'r')
/Users/michael/test.txt ——文件路径及文件名
r ——标识符
返回文件流对象,打开失败则会IOError报错!并且给出错误码和详细的信息告诉你文件不存在:
例如在 汉字.txt 文件所在的 文件夹test 位置打开 终端
>>> f = open('汉字.txt',"r") >>> f <_io.TextIOWrapper name='汉字.txt' mode='r' encoding='UTF-8'>
打开test_son.txt文件方式
>>> f2 = open("./test/test.txt","r") >>> f2 <_io.TextIOWrapper name='./test/test.txt' mode='r' encoding='UTF-8'>
注意绝对目录 /Users/michael/test.txt 和相对目录 ./test/test.txt 打开方式区别。
当打开失败时,会提示报错FileNotFoundError
>>> f2 = open("/test/test.txt","r") Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: [Errno 2] No such file or directory: '/test/test.txt'
打开文件出现错误时,可以用try...except进行异常处理
# 打开文件tset.txt,返回文件流对象并用f绑定 try: f = open("test.txt") print("文件打开成功") # 此处应进行读写操作 # ..... #关闭文件 f.close() except IOError: print("打开文件失败!!") print("程序结束")
2.2 读文件
2.2.1 read()方法
read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有内容至内存中。
语法: fileObject.read([size]) fileObject 表示文件流对象,size 表示从文件中最多读取的字节数,可选的,若无参数size,则读取至文件结束为止(它范围为字符串对象)。返回从字符串中读取的字节。
>>> f = open("汉字.txt","r") >>> f.read() '开始学习Python课程了\n'
备注:汉字.txt文件中语句为:开始学习Python课程了。
2.2.2 readline()方法
该方法时每次读取文件中的一行内容,返回一个字符串对象;
优点是读取时占用内存小,比较适合较大的文件,
文件readline.txt中内容
>>> f = open('readline.txt','r') >>> f.readline() '今天是1月26日,\n' >>> f.readline() '晴,外面可以看到阳光\n' >>> f.readline() '我在认真地学习python\n' >>> f.readline() '\n' >>> f.readline() '' >>> f.readline()
注意到在输出时自动在末尾加上换行符,readline()方法读到换行符\n时,就会挂起,当再调用时,指针就会向下移动,那如果人为地加上换行符,会是什么样的效果。
文件readline.txt中内容
>>> f2 = open('readline.txt','r') >>> f2.readline() '今天是1月26日,\n' >>> f2.readline() '晴,外面\\n可以看到阳光\n' >>> f2 = open('readline.txt','r') >>> f2.readline() '今天是1月26日,\n' >>> f2.readline() '晴,外面\\n可以看到阳光\n' >>> f2.readline() '晴,外面\\\\n可以看到阳光\n' >>> f2.readline() "晴,外面'\\\\n'可以看到阳光\n" >>> f2.readline() '我在认真地学习python\n'
2.2.3 readlines() 方法
readlines()方法是读取整个文件,并返回一个列表对象,每行作为一个列表元素;故读取大文件时会占有较大的内存
readlines.txt文件内容
>>> f = open('readlines.txt','r') >>> f.readlines() ['我是第一行\n', '我是第二行\n', '我是第三行\n']
2.2.4 read() readline() readlines() 使用对比
如果文件很小,read()
一次性读取最方便;如果不能确定文件大小,反复调用read(size)
比较保险;如果是配置文件,调用readlines()
最方便:
>>> f = open('readlines.txt','r') >>> for line in f: ... line.strip() # 把末尾的'\n'删掉 ... '我是第一行' '我是第二行' '我是第三行' >>> f1 = open('readlines.txt','r') >>> for line in f1.readlines(): ... line.strip() # 把末尾的'\n'删掉 ... '我是第一行' '我是第二行' '我是第三行'
2.3 关闭文件close()
第一,降低系统资源消耗;第二,系统再同一时间内打开的文件数量是有限的;故操作完文件后调用close()方法将文件关闭,
语法: f.close() f 为文件流对象
但是文件读写时都由可能产生IOError,一旦出现错误,位于后面的f.close()就不会被调用,也即打开的文件不能被关闭,这个会造成系统资源浪费,为了不管文件是否出错均能正确地关闭该文件,我们可以使用 try...finally 来实现对文件的关闭
try: f = open('test.txt', 'r') f.read() finally: if f: f.close()
2.4 with方法
with方法从 Python 2.5 开始引入的一种与异常处理相关的功能,非常适用与资源访问处理场合;
无论操作对象在使用过程中是否发生异常,在最后阶段,with方法均能将其“清理”并释放资源。
有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。
例如文件使用后的关闭,线程中锁的自动获取和释放等
使用with方法可以替代 try...finally 对文件处理功能
将“2.3 关闭文件close()”中的代码用with语句优化
with open("test.txt",'r') as f: f.read()
冗余的代码被with语句优化后显得更加优雅。
2.4 文件的常用方法
方法名 | 说明 |
---|---|
F代表文件流对象 | |
F.close() | 关闭文件 |
F.readline() | 读取一行数据,如果到达文件尾则返回空字符串 |
F.readlines(max_char=-1) | 返回每行字符串列表, max_char为最大字符数 |
F.read(size=-1) | 从一个文件流中最多读取size个字符(或字节(仅二进制)) |
F.writelines(lines) | 字符串列表的内容写到文件中 |
F.write(text) | 写一个字符串(或字节)到文件流中,返回写入字符数(或字节数) |
F.tell() | 返回当前文件流的绝对位置 |
F.seek(offset, whence=0) | 改变数据流的位置,返回新的绝对位置 |
F.readable() | 判断文件是否可读,可读返回True,否则返回Flase |
F.writeable() | 判断文件是否可写。可写返回True,否则返回False |
F.flush() | 把写入文件对象的缓存内容写入到磁盘 |
2.5 mode模式字符的含义
字符 | 含义 |
---|---|
'r' | 以只读方式打开(默认) |
'w' | 以只写方式打开,删除原有文件内容(如果文件不存在,则尝试创建该文件并以只写方式打开) |
'x' | 创建一个新文件,并以写模式打开这个文件,如果文件存在则会产生FileExistError错误 |
'a' | 以只写方式打开一个文件,如果有原文件,则追加到文件末尾 |
't' | 文本文件模式打开(默认) |
'b' | 用二进制模式打开 |
'+' | 为更新内容打开一个磁盘文件(可读可写) |
备注:当模式为"a"时,不管是否通过seek定位,均直接在文件尾追加文件
缺省模式是 'rt'
可以组合使用:
'w+b' 可以实现二进制随机读写,当打开文件时,文件内容将被清空
'r+' 以文本模式读和更新模式打开文件,打开文件时不会清空文件内容
示例:
f = open("output.txt", 'w') f.write("开始向文件中写入数据...\r\n") count = f.write("数据的第二行\r\n") print("您已写入", count, "个字符") L = ["数据的第三行\r\n", "数据的第四行\r\n", "数据的第五行"] f.writelines(L) f.close()
此时文件 output.txt 文件中出现:
开始向文件中写入数据... 数据的第二行 数据的第三行 数据的第四行 数据的第五行
以该文件为基础,再次进行文件操作
f = open("output.txt", 'r+') s = f.read(1) print("第一个字符是:", s) f.write("坏") f.write("\r\n坏") f.close()
运行
开始向文件中写入数据... 数据的第二行 数据的第三行 数据的第四行 数据的第五行坏 坏
附不同模式打开的完全列表:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
下图很好的总结了这几种模式:
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
参考文件:
示例微代码
input.txt 文件的内容
今天是平安日 明天是圣诞节 我们更期待春节
python读取代码
# 打开文件,返回文件流对象 用f绑定 try: f = open("input.txt") print("文件打开成功") s = f.read(3) # 读写两个字符 print(s) # '今天' f.close() except IOError: print("打开文件失败!!") print("程序结束")
运行
文件打开成功 今天是 程序结束
参考文档:python文件输入和输出
Python学习笔记015——文件file的常规操作之一(文本文件)的更多相关文章
- Python学习笔记015——文件file的常规操作(二进制文件)
有时候诸如图片.音乐等信息不是以文本的形式存储的,而是二进制文件格式存储的. 有时候很多信息不是以文本文件的形式存储的 很多时候,都需要用到二进制读取文件.毕竟很多信息不是以文本的形式存储.例如:图片 ...
- Python学习笔记015——文件file的常规操作之四(输入重定向)
windows命令提示符(cmd.exe)和Linux Shell(bash等)均可通过">"或”>>“将输出重定向.其中, ">"表示 ...
- Python学习笔记015——文件file的常规操作之三(标准输入输出文件)
1 标准输入输出文件 在Python中,模块sys中含有标准的输入输出文件 sys.stdin 标准输入方法(一般是键盘) sys.stdout 标准输出方法(到显示器的缓冲输出) sys ...
- Python学习笔记015——文件file的常规操作seek()及tell()
1 seek() 1.1 概述 file.seek()用于将文件游标移动到文件的任意位置,便于对文件的当前位置(增.删.改.查)操作 1.2 语法 fileObject.seek(offset[, w ...
- [Python学习笔记]组织文件
shutil 模块 shutil 模块可以让我们很方便的在Python程序中复制.移动.改名和删除文件. 复制文件和文件夹 使用shutil.copy()来复制文件,该函数含两个参数,均为字符串格式的 ...
- Python学习笔记之文件处理
1.打开和关闭 要打开文件可以使用函数 open(),它位于自动导入模块 io 中.函数将文件名作为唯一不可缺少的函数,并返回一个文件对象.它还有一个名叫 mode 的参数,用于指定文件模式,其可取值 ...
- python学习笔记(11):文件的访问与函数式编程
一.文本文件读写的三种方法 1.直接读入 file1 = open('E:/hello/hello.txt') file2 = open('output.txt','w') #w是可写的文件 whil ...
- python学习笔记(7)文件的访问与函数式编程
一.文件读写的3中方法 1.直接读入 fiel1=open('test.txt') file2=open('output.txt') while True: line=file1.readLine() ...
- Python学习笔记六--文件和输入输出
6.1文件对象 所有Python对文件的操作都是基于对文件对象的操作.那么就从文件对象的创建说起.open()[file()]提供初始化输入输出的接口.open()成功打开文件时会返回一个文件对象. ...
随机推荐
- water-and-jug-problem
以下这个解法也是参考了一些讨论: https://leetcode.com/discuss/110235/c-solution-using-euclidean-algorithm 还有这个解释原理的, ...
- 附6 hystrix metrics and monitor
一.基本方式 hystrix为每一个commandKey提供了计数器 二.实现流程 https://raw.githubusercontent.com/wiki/Netflix/Hystrix/ima ...
- AngularJs HTTP响应拦截器实现登陆、权限校验
$httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...
- Nginx配置文件(nginx.conf)配置具体解释
欢迎扫码增加Java高知群交流 Nginx的配置文件nginx.conf配置具体解释例如以下: user nginx nginx ; Nginx用户及组:用户 组. window下不指定 wo ...
- matlab使用常犯的错误
总是在最后关掉的时候忘了保存工作空间 save... 我用的版本R2013a 每次要setpath...!!!!!!!!!!
- ArcGIS高程Z值的去除方法
在ArcGIS中,我们常用的几何类型有点.线.面.体(体,在涉及三维的情况下使用),但在这之外,可能会遇到带ZM的类型,如图所示,面ZM,它与面类似,但比面多两个字段. 在编辑中查看草图属性可看到Z值 ...
- Excel只能输入不许修改
昨天出差,用户有个需求:需要他人录入数据,为了防止已经录入的数据被修改(录入数据由多方完成),必须限定只能输入,不能修改(修改时需要密码),最开始的方案是各设置一个密码,但如果他们相互之间联合 ...
- JDK5.0特性,使用ProcessBuilder执行本地命令
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IO ...
- hdu 4865 Peter's Hobby(概率dp)
http://acm.hdu.edu.cn/showproblem.php? pid=4865 大致题意:有三种天气和四种叶子状态.给出两个表,各自是每种天气下叶子呈现状态的概率和今天天气对明天天气的 ...
- Android自动填写获取到的验证码
Android需要添加的相关权限 <uses-permission android:name="android.permission.RECEIVE_SMS">< ...