在之前做爬虫的时候一直没有系统的整理一下,文件的保存。
今有时间,做一个小小的梳理。
1.文件读写操作:
当我们不用使用Python的文件操作前,首先我们要理清我们的思路:先创建一个文件,写入内容,保存关闭,这是我们写入文件的操作。
那么python对文件进行处理过程中需要使用open()这个方法,下面我们就要开始介绍这个方法。
我们首先要知道Python区分了以二进制和文本模式打开的文件
在open()方法中最重要的两个参数 file (文件名) mode(模式)
open()方法的功能 :用于打开一个文件,并返回对象,在使用这个方法后,一定要关闭文件的对象(IO操作一般都是有缓存的,不关闭句柄,文件内容还在缓存)。
在源码中我们可以看到这个方法要传递的所有参数
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
file:文件的路径 ,os.path.abspath()可以确定路径(必需)
mode: 文件打开的模式。
buffering:设置缓冲
encoding:字符编码
errors: 是一个可选的字符串,它指定如何编码错误,这个参数不应该在二进制模式中使用。通过如果存在编码错误,则引发ValueError异常(缺省的None具有相同的效果),或者将“ignore”传递给ignore错误。(注意忽略编码错误会导致数据丢失。)
newline:用于区别换行符,它只适用于文本模式
closefd:传入的file参数类型
区分二进制与文本,便要看mode的参数
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newline mode (deprecated)
当然单一的使用这些参数,是完不成我们想要的操作,看一下组合的意思
'r+' 打开一个文件用于读写,文件指针将会放在文件的开头
'rb' 以二进制格式打开一个文件只读。文件指针放在文件的开头
'rb+' 以二进制格式打开一个文件用于读写,文件指针将会放在文件的开头
'w+' 打开一个文件用于读写。
'wb' 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件,在数据库操作中要慎用w相关的操作
'wb+' 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
'a+' 打开一个文件用于读写。
'ab' 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
'ab+' 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
模式创建完成之后,我们就开始对file这个对象进行操作。
下面看下关于文件对象常用的方法:
在对这个文件进行操作时我们可以首先判断下,这个文件能不能进行读和写
f = open('美文.txt')
print(f.writeable()) #检测这个文件是否可以写入
print(f.readable()) #检测这个文件是否可以读
#在我们遇到 (.*?)able() 这类方法时基本上就是判断能不能执行的功能。
测试完之后,我们可以使用 print函数的内置方法,将要打印的内容,传到文件句柄中进行打印。这样也是一种写入的方法。
f = open('美文.txt','w')
print('hello world',file='f')
f.close()
f = open('美文.txt','a')
f.write('hello world \nhello world \nhello world') #将字符串写入文件,写入操作
f.close()
f = open('美文.txt','r') #读取操作
-------------------------->
print(f.read(100)) #从文件读取指定的字节数,如果未给定或为负则读取所有。
-------------------------->
print(f.readline()) #读取文件的第一行数据,包括 "\n" 字符
-------------------------->
print(f.readline(3)) #读取一行指定的字节数。
-------------------------->
print(f.readlines()) #读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
f.close()
-------------------------->
hello world
hello world
hello world
-------------------------->
hello world
-------------------------->
hel
-------------------------->
['hello world \n', 'hello world \n', 'hello world']
上面是关于文件的操作,下面几个实例,关于的是图片、音乐和视屏,这些数据都是由二进制文件。话不多少上代码
2.图片的下载:
import requests
img_data = requests.get('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1582812072288&di=e224270da441f72559c487ad90b15442&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201803%2F18%2F20180318210814_fhceh.jpg')
content = img_data.content
print(content)
new_img = open('点赞.jpg','wb')
new_img.write(content)
new_img.close()
3.音乐的重新保存:
music = open('D:/CloudMusic/棉子 - 勇气.ncm','rb')
music_data = music.read()
new_music = open('勇气.ncm','wb')
new_music.write(music_data)
new_music.close()
4.视屏下载保存:
import requests
data = requests.get('https://vdept.bdstatic.com/62637150477a6b646432457a384e3938/5575365071497747/fd6bc7e486462424fe27f67126794674a41da7e564332979bf2270458bb48bb62e5df1671132e68472d1428f0292201a.mp4?auth_key=1582801995-0-0-2dfa9e3c1ef90ddf91dc9b208f3a2507')
content = data.content
print(content)
video = open('demo.mp4','wb')
video.write(content)
video.close()
今天就到这了。
see you again !!!