Python文件读写文件是最常见的IO操作。 Python内置了读写文件的函数,其用法与C兼容。
在读写文件之前,我们首先要了解,在磁盘上读写文件的功能是由操作系统提供的。现代操作系统不允许普通程序直接操作磁盘。
python学习网,大量的免费
,欢迎在线学习!
读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后通过操作系统提供的接口从文件对象中读取数据(读文件),或者将数据写入文件对象(写文件)
With open函数打开文件的各种方式
1.读文件
要以文件读取模式打开文件对象,请使用 Python 的内置 open() 函数,传入文件名和标识符:
f = open( '/Users/michael/test.txt', 'r' )
标识符“r”表示已读取,因此我们成功打开了一个文件。
如果文件不存在,open() 函数将抛出一个带有错误代码和详细信息的 IOError,告诉你文件不存在:
f=open('/Users/michael/notfound.txt', 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'
如果文件打开成功,接下来调用read()方法一次性读取文件的全部内容,Python将内容读入内存,用str对象表示:
f.read()
'Hello, world!'
最后一步是调用 close() 方法来关闭文件。文件在使用后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统可以同时打开的文件数量是有限的:
f.close()
由于文件读取或写入时可能会产生IOError,因此一旦发生错误,后续的f.close()将不会被调用。因此,为了确保文件正确关闭而不管错误,我们可以使用 try...finally :
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
2.使用With Open 函数打开,以及常见的坑
使用方法
但是每次都这样写太麻烦了,所以Python引入了with语句来自动为我们调用close()方法:
with 的作用就是调用close()方法
with open( '/path/to/file', 'r' ) as f:
print( f.read() )
f.read() 读取全部文件内容
这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
调用 read() 将一次读取文件的全部内容。如果文件有10G,内存就会爆炸。
为了安全起见,你可以重复调用 read(size) 方法,每次最多读取 size 个字节。例如 read(1024) 一次读取 1024 个字节的数据内容
调用 readline() 一次读取一行,调用 readlines() 一次读取所有内容并逐行返回一个列表。因此,需要根据需要来决定如何调用。
如果文件很小,read() 一次读取最方便;如果无法确定文件大小,重复调用 read(size) 会更安全;如果是配置文件,调用readlines()最方便:
for line in f.readlines():
print( line.strip() )
在strip()函数中把'\n'放在最后可以删除目标内容行中的所有空格、空行等,只留下文本内容。
常见的坑
(1)如上图,Fold001文件夹下有一个read_file.py文件。该文件读取 hello.txt 文件。代码如上图,这样就可以正常引用了。
(2)但是如果引用静态文件的函数被其他函数再次调用,比如Fold002中的函数read.py,那么readfile()函数就相当于在read.py所在目录执行,那么静态文件hello.txt相对于read.py的路径不是上图中的路径,否则会运行报错,如下:
3.写入内容
写文件和读文件一样,唯一的区别是调用open()函数时,传入标识符'w'或'wb'表示写文本文件或写二进制文件:
f = open('/Users/michael/test.txt', 'w')
f.write('Hello, world!')
f.close()
你可以重复调用 write() 来写入文件,但一定要调用 f.close() 来关闭文件。
我们在写文件的时候,操作系统往往不会立即将数据写入磁盘,而是将其存储在内存缓存中,空闲的时候再慢慢写入。
只有调用 close() 方法时,操作系统才会保证所有未写入的数据都会写入磁盘。忘记调用 close() 的后果是只有部分数据可能写入磁盘,其余的则丢失。因此,为了安全起见,仍然使用 with 语句:
4.With Open写入内容
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
要编写具有特定编码的文本文件,请将编码参数传递给 open() 函数以自动将字符串转换为指定的编码
字符编码
5.打开非utf-8编码的文件
读取非UTF-8编码的文本文件,需要将encoding参数传递给open()函数,例如读取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' )
6.打开二进制文件
上面提到的默认是读取文本文件,它们是 UTF-8 编码的文本文件。要读取二进制文件,例如图像、视频等,请以 'rb' 模式打开文件:
f = open('/Users/michael/test.jpg', 'rb' )
f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
7.多个文件的读写操作(2种方法可供参考)
with open('/home/xbwang/Desktop/output_measures.txt','r') as f:
with open('/home/xbwang/Desktop/output_measures2.txt','r') as f1:
with open('/home/xbwang/Desktop/output_output_bk.txt','r') as f2:
........
with open('/home/xbwang/Desktop/output_measures.txt','r') as f:
........
with open('/home/xbwang/Desktop/output_measures2.txt','r') as f1:
........
with open('/home/xbwang/Desktop/output_output_bk.txt','r') as f2:
......
8.总结
(1)‘baidu.html’为需要保存的文件名‘wb’为打开方式:以二进制方式读写f为打开文件名
with open('baidu.html','wb') as f:
f.write ( response.content )
(2)f.read([size])
如果不指定大小,则返回整个文件,如果文件大小> 2 倍内存,则会出现问题。
f.read()读到文件尾时返回""(空字串)
(3)file.readline() 返回一行
file.readline([size])
返回包含size行的列表,size 未指定则返回全部行
for line in f:
print line #通过迭代器访问
f.write("hello\n") #如果要写入字符串以外的数据,先将他转换为字符串.
f.tell() #返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).
f.close() #关闭文件
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python中的条带是什么?11/01
- ♥ python打印列表出现中文乱码怎么解决?10/27
- ♥ 如何在python中编写代码以跳转到下一行08/20
- ♥ python是怎么划分的08/13
- ♥ 如何在python中进行冒泡排序09/17
- ♥ 如何将参数传递给python中的函数11/25
内容反馈