cp操作请跳到第10节
1.open内建打开文件函数
作为打开文件的“钥匙”,内建函数open()提供了初始化输入/输出(I/O)操作的通用结接口
成功打开文件后会返回一个文件对象,如果打开失败会引发一个错误
示例:
file_object = open(file_name,mode='r')
file_object 是python的变量名用来保存文件对象
mode是打开的方式,以读或者写或其他方式打开。以读打开就只能对文件进行读操作而不能进行写操作
mode模式:
1.5 close关闭文件
文件被打开后会自动丢进堆栈,如果是一个较大的文件有必要在使用后关闭
file_object.close 关闭文件
2.read文件输入函数
read()方法用来直接读取字节到字符串中,最多读取给定数目个字节,如果没有给定size参数(默认值为-1)或者sieze为负,文件将被读取直至末尾。
示例:
data=file_object.read()
print(data)
3.readline方法
读取打开文件的一行(读取下个行结束符之前的所有字节),包括行结束符,作为字符串返回
readline也有一个可选的size参数,默认为-1,代表读至行结束符,如一行10个字符,size=5,则读一行的前5个字符
示例:
data=file_object.readline()
print(data)
4.readlines方法
读取所有行,作为字符串返回,与readline(读单行)不同,readlines读取所有行
示例:
data=file_object.readlines()
print(data)
5.迭代输入每一行
如果需逐行处理文件,可以结合for循环迭代文件,迭代文件的方法与处理其他序列类型的数据类似
实例:
data=open('/mnt/1.txt')
for l in data:
print(l)
open一个linux下的文件
6.write方法
write()内建方法功能与read()和readline()相反,它把含有文本数据或二进制数据块的字符串写入到文件中去,写入文件时,不会自动添加行结束符,需要程序员手工输入(比如\n换行符)。
实例:
file_object.write('hello world\n')
将hello world\n输入到file_object文件对象
7.writelines方法
和readlines()一样,wirelines()方法时针对列表的操作,他接受一个字符串列表作为参数,将他们写入文件,行结束符并不会被自动加入,所以如果需要的话,必须在调用writelines()前给每行结束尾加上行结束符
实例:
file_object.writelines(['hello world\n','my name is xx'\n])
此方法将写入两条
8.with子句
with语句是用来简化代码的,在将打开文件的操作放在with语句中,代码结束后文件自动被管理
with open('/mnt/1.py') as f
data = f.readlines()
输入两次回车结束
f.closed验证是否关闭,true则是关闭
9.文件内移动
seek(offset[,whence]):移动文件指针到不同的位置
offset是相对于某个位置的偏移量
whence的值,0表示文件开头,1表示当前位置,2表示文件的结尾
实例:
seek(0[,2])
以开头为标准,将文件指针移动到结尾
10.模拟cp操作
步骤:
获取用户原文件名和新文件名,打开原文件,打开新文件,从打开的原文件中读取数据,写入到打开的新文件中,关闭两个文件
cp代码的过程中,需要注意的部分在于:
如果一个文件过大,你将无法直接读取数据到内存,此时,使用while循环语句,分次读取数据,每次读4096字节,读取数据为空时,结束循环,将数据写入到目标文件
实验:
创建cp.py文件,实现以下目标:
1)小文件cp
- #!/usr/bin/env python3
- f1 = open('/bin/ls', 'rb')
- f2 = open('/root/ls', 'wb')
- data = f1.read()
- f2.write(data)
- f1.close()
- f2.close()
提示:打开的文件必须存在,新文件不需要存在(将自动被创建) ,这里的话f1必须是存在的,不要求f2存在
2)大文件cp
- [root@localhost day03]# vim cp2.py
#!/usr/bin/env python3
f1=open('/mnt/1.py','rb')
f2=open('/opt/2.py','wb')while True:
data=f1.read(4096) # 每次读4096字节
if data==b'': # 读不到数据意味着读写完毕,中断循环
break
f2.write(data) # 将数据写到目标文件f1.close()
f2.close()
提示:有两个地方要注意,1是while循环的缩进,而是if data ==b'',b代表bytes字节符,因为的我们是以bytes字节符打开文件的所以判断的时候也要将它转换成bytes
3)建议的cp方式
使用我们在上面提到的with方法,cp完后自动关闭文件。这样做事最安全也是最节省资源的
#!/usr/bin/env python3
with open('/mnt/1.py','rb') as src_f:
with open('/opt/1.py','wb') as dst_f:
while True:
data=src_f.read(4096)
if not data:
break
dst_f.write(data)
4)带参数的cp
使用sys.argv方法:sys.argv方法表示空列表
执行脚本时输入命令: python3 cp_func.py /bin/ls /root/ls
表示sys.argv=[1.py,‘ /mnt/1.py’,‘ opt/1.py’],所以,调用copy函数时,列表切片方式获取实参为(‘ /mnt/1.py’,‘opt/1.py’)
#!/usr/bin/env python3
import sys
def copy(src_fname,dst_fname):
with open(src_fname,'rb') as s:
with open(dst_fname,'wb') as d:
while True:
data=s.read(4096)
if not data:
break
d.write(data)copy(sys.argv[1],sys.argv[2])
...
...
$ python3 1.py '/mnt/1.py' '/opt/1.py'
提示:要导入sys模块,sys.argv从1开始计算(0保存文件名)