python文件的读写总结
读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。
读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
python 文件操作记住1个函数3个方法:(python中一切皆为对象)
open():请求打开文件:
如果文件存在返回文件的操作对象,
如果文件不存在,会抛出异常
关于open()的mode参数:
'r':读
'w':写
'a':追加
'r+' == r+w(可读可写,文件若不存在就报错(IOError))
'w+' == w+r(可读可写,文件若不存在就创建)
'a+' ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b就好啦:
'rb' 'wb' 'ab' 'rb+' 'wb+' 'ab+'
read方法——读取文件,将文件读取到内存中,可以一次性读取文件所有内容
write方法——将文件内容写入到文件
close方法——关闭文件
准备文档
往事随风 - 齐秦
词:许常德
曲:涂惠元
你的影子无所不在
人的心事像一颗尘埃
落在过去 飘向未来
掉进眼里就流出泪来
曾经沧海无限感慨
有时孤独比拥抱实在
让心春去 让梦秋来
让你离开
舍不得忘
一切都是为爱
没有遗憾 还有我
就让往事随风 都随风 都随风 心随你动
昨天花谢花开 不是梦 不是梦 不是梦
一、读文件
1、打开文件
要以读文件的模式打开一个文件对象,使用Python内置的open()
函数,传入文件名和标示符.
首先,我们看下open函数的定义:
def open(file: Union[str, bytes, int], mode: str = ..., buffering: int = ..., encoding: Optional[str] = ..., errors: Optional[str] = ..., newline: Optional[str] = ..., closefd: bool = ...) Inferred type: (file: Union[str, bytes, int], mode: str, buffering: int, encoding: Optional[str], errors: Optional[str], newline: Optional[str], closefd: bool) -> IO Open file and return a stream. Raise IOError upon failure.
在一般情况下,我们打开文件只需要传入文件路径即可,这里我们读取的文件的内容是中文,为了避免乱码,我们在这里指定了编码格式。其他的参数等我们用到的时候,在仔细说明。open函数返回一个表示文件的对象,python会将这个对象存储在我们的变量f中,这样我们就可以方便的操作了。
我先在桌面创建一个名叫test.txt的文本文件:
>>> f =open('C:\Users\24414\Desktop\test.txt','r',encoding='utf-8')//以绝对路径打开文件
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
出现这个错误的原因是:windows中的路径是反斜杠\,然而反斜杠\在python中有着转义字符的意义,所以在py文件中写windows文件路径的时候,要特别注意反斜杠\的使用。
下面有三种解决方式:
>>> f =open('C:\\Users\\24414\\Desktop\\test.txt','r',encoding='utf-8')
>>>
>>> f =open(r'C:\Users\24414\Desktop\test.txt','r',encoding='utf-8')
>>>
>>> f =open('C:/Users/24414/Desktop/test.txt','r',encoding='utf-8')
>>>
标示符'r'表示读,这样,我们就成功地打开了一个文件。
如果文件不存在,open()
函数就会抛出一个IOError
的错误,并且给出错误码和详细的信息告诉你文件不存在:
>>> f =open('C:\Users\24414\Desktop\test1.txt','r',encoding='utf-8')
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
>>>
2、读取文件
2.1 读取整个文件
操作文件的第一步就是得打开要操作的文件,然后进行读取。在python中我们可以使用open函数来打开一个文件,然后使用read方法来读取文件。
示例1,data.txt和我们的文件在同一目录下,所以直接使用名称即可::
如果是其他路径(非程序目录),那么直接使用绝对路径:
我是在window的开发环境,以windows为例,我们在桌面有一个data1.txt文件:我们在将文件打开后,打印一下这个f到底有些什么:
>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> f.read()
'往事随风 - 齐秦\n词:许常德\n曲:涂惠元\n你的影子无所不在\n人的心事像一颗尘埃\n落在过去 飘向未来\n掉进眼里就流出泪来\n 曾经沧海无限感慨\n有时孤独比拥抱实在\n让心春去 让梦秋来\n让你离开\n舍不得忘\n一切都是为爱\n没有遗憾 还有我\n就让往事随风 都随风 都随风 心随你动\n昨天花谢花开 不是梦 不是梦 不是梦'
>>>
print(dir(f))
输出:
['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']
>>>
这些都是和文件操作相关的,在这里不会给大家做仔细说明,只是让大家对这些东西有个印象,等遇到了,我们在说怎么使用。
2.2 逐行读取
上面是读取整个文件内容,接下来我们看下怎么逐行读取文件。
在逐行读取文本的时候,常见的可以使用for循环来读取:
2.2.1 read()
read:如果指定了参数 size,就按照该指定长度从文件中读取内容,否则,就读取全文。被读出来的内容,全部塞到一个字符串里面。这样有好处,就是东西都到内存里面了,随时取用;但如果文件内容太多了,内存会吃不消。注意换行符也为占用一个内存,缺点需要知道光标的位置,以及每一行的大小SIZE。
>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> f.read(10)
'往事随风 - 齐秦\n'
>>> f.read(5)
'词:许常德'
>>>
2.2.2 readline()
概述:readline() 方法用于从文件读取整行,包括 "\n" 字符。从字面意思可以看出,该方法每次读出一行内容。所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符。
语法
fileObject.readline();
参数
size -- 从文件中读取的字节数。
返回值
返回从字符串中读取的字节。
>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> while True:
... line=f.read()
... if not line:#到 EOF,返回空字符串,则终止循环
... break
... print(line)
...
往事随风 - 齐秦
词:许常德
曲:涂惠元
你的影子无所不在
人的心事像一颗尘埃
落在过去 飘向未来
掉进眼里就流出泪来
曾经沧海无限感慨
有时孤独比拥抱实在
让心春去 让梦秋来
让你离开
舍不得忘
一切都是为爱
没有遗憾 还有我
就让往事随风 都随风 都随风 心随你动
昨天花谢花开 不是梦 不是梦 不是梦
>>>
2.2.3 readlines()
概述:readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。当文件太大时,内存可能不够用。 如果碰到结束符 EOF 则返回空字符串。
如果碰到结束符 EOF 则返回空字符串。
语法
readlines() 方法语法如下:
fileObject.readlines( );
参数
无。
返回值
返回列表,包含所有的行。
>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> print(f.readlines())
['往事随风 - 齐秦\n', '词:许常德\n', '曲:涂惠元\n', '你的影子无所不在\n', '人的心事像一颗尘埃\n', '落在过去 飘向未来\n', '掉进眼里就流出泪来\n', '曾经沧海无限感慨\n', '有时孤独比拥抱实在\n', '让心春去 让梦秋来\n', '让你离开\n', '舍不得忘\n', '一切都是为爱\n', '没有遗憾 还有我\n', '就让往事随风 都随风 都随风 心随你动\n', '昨天花谢花开 不是梦 不是梦 不是梦']
>>> for line in f.readlines():
... print(line)
...
>>>
>>>
>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> for line in f.readlines():
... print(line)
...
往事随风 - 齐秦 词:许常德 曲:涂惠元 你的影子无所不在 人的心事像一颗尘埃 落在过去 飘向未来 掉进眼里就流出泪来 曾经沧海无限感慨 有时孤独比拥抱实在 让心春去 让梦秋来 让你离开 舍不得忘 一切都是为爱 没有遗憾 还有我 就让往事随风 都随风 都随风 心随你动 昨天花谢花开 不是梦 不是梦 不是梦
>>>
2.3 读取大文件
如果文件太大,就不能用 read() 或者 readlines() 一次性将全部内容读入内存。
方法一、可以使用 while 循环和 readline() 来完成这个任务。
这里不再举例
方法二、使用 fileinput 模块:
>>> import fileinput
>>> for line in fileinput.input(r'C:\Users\24414\Desktop\data1.txt'):
... print(line)
...
往事随风 - 齐秦 词:许常德 曲:涂惠元 你的影子无所不在 人的心事像一颗尘埃
......
第三种方法,直接读取文件句柄,推荐使用这种方法
>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> f
<_io.TextIOWrapper name='C:\\Users\\24414\\Desktop\\data1.txt' mode='r' encoding='gbk'>
>>> for line in f:
... print(line)
...
往事随风 - 齐秦 词:许常德 曲:涂惠元 你的影子无所不在 人的心事像一颗尘埃
之所以能够如此,是因为 file 是可迭代的数据类型,直接用 for 来迭代即可
3、 关闭文件
最后一步是调用
close()
方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:
f.close()
每次都要使用完都要关闭文件,很容易忘记,而且每次都这么写实在太繁琐,所以,Python引入了
with
语句来自动帮我们调用close()
方法:
>>> with open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk') as f:
... for line in f:
... print(line.strip())
...
往事随风 - 齐秦
词:许常德
曲:涂惠元
你的影子无所不在
人的心事像一颗尘埃
落在过去 飘向未来
掉进眼里就流出泪来
曾经沧海无限感慨
注意:
file-like Object
像open()
函数返回的这种有个read()
方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()
方法就行。
StringIO
就是在内存中创建的file-like Object,常用作临时缓冲。
二进制文件
前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'
模式打开文件即可:
字符编码
要读取非UTF-8编码的文本文件,需要给open()
函数传入encoding
参数,例如,读取GBK编码的文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError
,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()
函数还接收一个errors
参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
二、写文件
写文件和读文件是一样的,唯一区别是调用open()
函数时,传入标识符'w'
或者'wb'
表示写文本文件或写二进制文件
>>> f = open(r'C:\Users\24414\Desktop\data2.txt', 'w',encoding='gbk')
>>> f.write('Hello world!')
12
>>>f.flush()
注意:如果指定路径没有data2.txt文件,它会先创建一个文件。
当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。如果没有这句代码f.flush(),内容只是被写到了缓冲区,等缓冲区满了,才会将内容写到文件中。有了这句代码就会直接写入到文本中,而不会等待缓冲区满。当然也可以最后,调用f.close()实现相同的功能。没有这一步的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
python文件对象提供了两个“写”方法: write() 和 writelines()。
- write()方法和read()、readline()方法对应,是将字符串写入到文件中。
>>> with open(r'C:\Users\24414\Desktop\data2.txt','w',encoding='gbk') as f:
... f.write('1\n2\n3\n')
...
6
>>>
- writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。
f1 = open(r'C:\Users\24414\Desktop\data2.txt'
, 'w')
f1.writelines(["", "", ""]) # 此时test1.txt的内容为:123
f1 = open(
r'C:\Users\24414\Desktop\data2.txt', 'w')
f1.writelines(["1\n", "2\n", "3\n"])
# 此时test1.txt的内容为: # # 2 #
三、file类的其他方法
3.1 tell()和seek() 注意:这里的位置指的是字节数,而不是字符个数
tell() | seek() | |
概述 | 返回文件的当前位置,即文件指针当前位置。 | 用于移动文件读取指针到指定位置。 |
语法 | fileObject.tell() |
fileObject.seek(offset[, whence]) |
参数 | 无 |
|
返回值 | 返回文件的当前位置。 | 如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。 |
1 with open('data', 'r', encoding='utf-8') as f:
2 print(f.readline().rstrip())
3 print(f.tell())
4 print(len('往事随风 - 齐秦\n'.encode('utf-8')))
5 print(f.read(4))
6 print(f.tell())
7 f.seek(0)
8 print(f.readline().rstrip())
9 输出>>>
10 往事随风 - 齐秦
11 23
12 22
13 词:许常
14 35
15 往事随风 - 齐秦
3.2 File flush()
概述 |
语法 |
参数 |
返回值 |
flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。 一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。 |
fileObject.flush(); |
无 | 该方法没有返回值。 |
import sys,time
for i in range(50):
sys.stdout.write('#')
sys.stdout.flush()
time.sleep(0.5)
输出>>>
##################################################
3.3 next()
概述 | 语法 | 参数 | 返回值 |
Python 3 的内置函数 next() 通过迭代器调用 __next__() 方法返回下一项。 在循环中,next()方法会在每次循环中调用,该方法返回文件的下一行,如果到达结尾(EOF),则触发 StopIteration |
next(iterator[,default]) |
无 | 返回文件下一行。 |
文档内容:
第一行
第二行
第三行
第四行
第五行
示例:
>>> f=open(r'C:\Users\24414\Desktop\data1.txt','r')
>>> for index in range(5):
... line=next(f)
... print(index,':',line)
...
0 : 第一行 1 : 第二行 2 : 第三行 3 : 第四行 4 : 第五行
>>>
3.4 truncate()
概述 |
语法 |
返回值 |
参数 |
truncate() 方法用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字节被删除. |
fileObject.truncate( [ size ]) |
该方法没有返回值。 | size -- 可选,如果存在则文件截断为 size 字节。 |
有坑:根据上述文档说明不带参truncate()函数会截取文件头到当前游标位置的字节。
但是,当文件以文本的形式打开时,进行读操作造成游标改变时,文件不会被截取.同样的操作,当文件以二进制方式打开时,文件才会被截取.原因还未知
f = open("data1", "r+", encoding="utf-8")
print(f.readline())
f.truncate()
f.seek(0)
print(f.read())
输出>>>
第一行 第一行
第二行
第三行
第四行
第五行
f = open("data1", "r+", encoding="utf-8")
print(f.readline())
f.truncate(10)
f.seek(0)
print(f.read())
输出>>>
第一行 第一行
3.5 不常用的两个操作
fileno() | 返回一个整型的文件描述符,可以用于一些底层IO操作上(如,os模块的read方法) |
isatty() | 判断文件是否被连接到一个虚拟终端,是则返回True,否则返回False |
python文件的读写总结的更多相关文章
- python文件的读写的模式
<1>打开文件 在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件 open(文件名,访问模式) 示例如下: f = open('test.txt', 'w' ...
- Python文件的读写操作
Python文件的使用 要点:Python能够以文本和二进制两种形式处理文件. 1.文件的打开模式,如表1: 注意:使用open()函数打开文件,文件使用结束后耀使用close()方法关闭,释放文件 ...
- python文件的读写权限以及相关应用read、write和文件指针
f=open('ceshi.txt','a',encoding='utf-8')r=open('ceshi.txt','r',encoding='utf-8')上面的2种写法可以用with来写:wit ...
- Python文件的读写
一.写数据 f = open("hello.txt", "w") f.write("hello world python!") f.clos ...
- 【8】python文件的读写方法
(1).读文件的步骤: (1)打开文件 open(path,flag,encoding,[errors]) path:打开路径 flag:打开方式 r(只读) rb(二进制格式) r+(可以读写) w ...
- [ Python ] 文件的读写操作
1. 文件读写操作 读写文件是最常见的 IO 操作, Python 内置了读写文件的函数.在磁盘上读写文件的功能是由操作系统提供的,所以读写文件是请求操作系统打开一个文件对象(通常称为文件描述符),然 ...
- python文件的读写追加等操作
# encoding:utf-8 # 文件读取操作 fp=open("E:\\file.txt","r",encoding="utf-8" ...
- 第9.9节 Python文件随机读写定位操作方法seek
类似于C语言,Python也提供了文件位置定位的操作方法seek. 一. 语法 seek(offset, whence=SEEK_SET) 语法释义: 1)offset :将文件当前操作位置移动偏移量 ...
- python: 文件的读写
#文件的读取.py a=open('test.txt').readline() #只读取文件第一行,保存为字符串格式 b=open('test.txt').read() #读取全部内容,保存为字符串格 ...
随机推荐
- PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload
1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...
- springboot2.0+websocket集成【群发消息+单对单】(二)
https://blog.csdn.net/qq_21019419/article/details/82804921 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上 ...
- django ORM数据库操作
5.使用Django的ORM详细步骤: 1. 自己动手创建数据库 create database 数据库名; 2. 在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库) # ...
- Python 循环列表删除元素的注意事项
错误示范: class Solution: def removeElement(self, nums, val: int) -> int: for i, num in enumerate(num ...
- sendmail 出现 My unqualified host name的解决办法
有"My unqualified host name"错误 修改/etc/hosts, 在本机的ip那一行, 在xxxhostname后面加上" xxxhostname ...
- 计蒜客NOIP模拟D1T2
原题: 蒜头君有一棵有根树,树的每一边都有边权,蒜头君想知道任意两点间最短距离之和为多少.另外,由于各种原因,蒜头君的树的边的边权会发生若干次改变,蒜头君想让你告诉他,每一次改变后,任意两点间最短距离 ...
- substr()、substring()、slice()
substr(start,length) start(必选)开始位置的下标 可为负数-1即为倒数第一个字符以此类推 0为第一个字母下标 length长度(可选)如果省略该参数则默认到最后一位 var ...
- Docker常规操作
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11601853.html Docker 常⽤命令 镜像相关 • docker pull <imag ...
- 【LeetCode 84】柱状图中最大的矩形
题目链接 [题解] 维护一个单调递增的栈. 会发现栈内的第i个元素的前面一个(i-1)元素在原始的序列中的数字 都是要高于第i个元素的.(或者没有元素) 那么第i个元素往左最多可以扩展到第i-1个元素 ...
- 【Python】用python -m http.server 8888搭建本地局域网
python -m http.server 8888 由于工作中经常会用到局域网中同事之间互传文件,当文件太大时,可以采用局域网ftp之类的方式进行传输. 这里采用python的一个服务,可以快速的搭 ...