python读写文件
一、python读写文件
在使用python编程时,经常会遇到读写文件的操作
对比windows中手动操作txt文档,我们来说明python中如何操作txt文件
① windows中手动操作txt文件的步骤
- 找到word文档
- 打开word文档
- 查看(或操作)word文档中的内容
- 关闭word文档
② python操作txt文件的步骤
- 找到并打开文件,然后获取返回的被打开文件的内存对象,该内存对象又叫做“文件句柄”。
- 通过这个内存对象(文件句柄),来对文件进行操作(读取,写入等操作)。
- 关闭文件
使用python读取一个txt文件的时候,相当于把这个文件从硬盘上,读取到了内存中。我们如果想要操作这个文件,就先要获取这个文件对象(或者叫文件句柄)。这个“文件句柄”包含了文件的文件名、文件的字符集、文件的大小、文件在硬盘上的起始位置等内容,
python读取文件的第一步是用open函数打开文件。open()是python的内置函数,它会返回一个文件对象,这个文件对象拥有read、readline、write、close等方法。
二、python读写文件常用的几个方法
- open(“filepath”,“mode”) - 打开文件
- close() - 关闭文件,并立即释放它使用的所有系统资源
- read()- 读取文件内容。你可以把读取结果赋给一个变量。
- readline() - 只读取文本文件的一行内容。
- readlines()-读取所有行,返回的是所有行组成的一个列表
- truncate() - 清空文件。清空的时候要当心。
- write('stuff') - 给文件写入一些“东西”。
- seek(0) - 把读/写的位置移到文件最开头。
2.1 Open("file","mode")函数
参数解释
file:需要打开的文件路径
mode(可选):打开文件的模式,如只读、只写、追加、可读写等,mode参数可以省略不填,默认为r模式
mode常用的模式:
- r:表示文件只能读取
- w:表示文件只能写入
- a:表示打开文件,在原有内容的基础上追加内容,在末尾写入
- w+:表示可以对文件进行读写双重操作
mode参数还可以指定以什么样的编码方式读写文本,默认情况下open是以文本形式打开文件的,比如上面的四种mode模式。
当你需要以字节(二进制)形式读写文件时,只需要在mode参数中追加'b'即可,如下:
- rb:以二进制格式打开一个文件,用于只读
- wb:以二进制格式打开一个文件,用于只写
- ab:以二进制格式打开一个文件,用于追加
- wb+:以二进制格式打开一个文件,用于读写
文件读写的几种常见模式
注意:当我们读取某个文件,向文件中写入某些内容(覆盖写),或者向文件中追加写入某写内容时,最好的方式就是分别使用r、w、a这三种模式。
对于r+、w+、a+这三种模式,如果你不是特别清楚python文件读写的原理,就不要轻易使用,可能会出现很多意想不到的问题,一般用这三种模式时可能会用到下面2.7里面的seek(0)方法来改变文件指针位置
2.2 read()方法
当使用open函数打开文件后,就可以使用该文件对象的各种方法了,read方法就是其中一个。
read()会读取文件一些数据并将其作为字符串(在文本模式下)或字节对象(在二进制模式下)返回。
read方法有一个参数:
f.read(size) # f为文件对象
参数size(可选)为数字,表示从已打开文件中读取的字节计数,默认情况下为读取全部。假设有一个文件sample1.txt,现在读取该文件:
f=open('sample1.txt') #打开文件
content = f.read() #读取文件
print(content) #将读取的字符串打印出来 f.close() #关闭文件
2.3 readline()方法
readline方法从文件中读取整行,包括这一行后的换行符'\n',如果要去掉换行符可以始终strip()方法。
如果 f.readline() 返回一个空的字符串,则表示已经到达了文件末尾,而空行使用 '\n' 表示,该字符串只包含一个换行符。
f.readline()有一个参数:
f.readline(size)
参数size表示从文件读取的字节数。
2.4 readlines()方法
readlines方法和readline方法长得像,但功能不一样,前面说过readline方法只读取一行,readlines方法则是读取所有行,返回的是所有行组成的一个列表
2.5.read,readline、readlines三者区别
2.5 write方法
write方法顾名思义,就是将字符串写入到文件里。
它只有一个参数:
f.write([str]) # f为文件对象
参数[str]代表要写入的字符串
2.6 truncate方法
truncate()方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断 size 后面的所有字符全被删除
2.7 seek() 方法
用于移动文件读取指针到指定位置。
file.seek(offset[, whence])
各个参数的含义如下:
- file:表示文件对象;
- whence:作为可选参数,用于指定文件指针要放置的位置,该参数的参数值有 3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。
- offset:表示相对于 whence 位置文件指针的偏移量,正数表示向后偏移,负数表示向前偏移。例如,当
whence == 0 &&offset == 3
(即 seek(3,0) ),表示文件指针移动至距离文件开头处 3 个字符的位置;当whence == 1 &&offset == 5
(即 seek(5,1) ),表示文件指针向后移动,移动至距离当前位置 5 个字符处。
2.8 close()
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,这个时候就需要用到close()方法来关闭文件
由于文件读写时都有可能产生IOError
,一旦出错了,后面的f.close()
就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,一般会使用try ... finally
来补货异常用来实现文件可正常关闭,如下
try:
f = open(r'c:/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
但是每次都这么写实在太繁琐,所以,Python就引入了with
语句来自动帮我们调用close()
方法,r如下所示:
with open(r'c:/path/to/file', 'r') as f: print(f.read())
三、超大文件如何读取(文件大于可用内存)
f=open(r"D:\Gedit_V2.30.1_XiTongZhiJia\sample1.txt","r",encoding="UTF-8") #打开一个文件并返回一个文件对象,这个文件对象是可迭代的
for line in f:
print(line.strip())
在这里f相当于一个迭代器,我们使用for循环迭代f 中元素。每循环一次,就相当于读取文件的一行到内存中,并记住这一次读取到的位置。当进行下次迭代的时候,上一次读取到内存中的内容,就会被销毁了,当前内存中读取的就是第二行的内容。当进行第三次循环的时候,内存中第二行的内容也会被销毁,此时内存中只会保存第三行的内容,这样依次进行下去。直到最后一次循环,读取最后一行的内容,此时,内存中保留的也只是最后一行的内容。
迭代器有一个特性:每次进行迭代的时候,就会记住当前读取的位置。当进行下一次迭代的时候,前面的内容会被销毁掉,在内存中只会保留当前循环得到的内容