Python对Linux系统的操作,打开文件与读写文件,python模拟linux的cp操作

cp操作请跳到第10节

1.open内建打开文件函数

作为打开文件的“钥匙”,内建函数open()提供了初始化输入/输出(I/O)操作的通用结接口

成功打开文件后会返回一个文件对象,如果打开失败会引发一个错误

示例:

file_object = open(file_name,mode='r')

file_object 是python的变量名用来保存文件对象

mode是打开的方式,以读或者写或其他方式打开。以读打开就只能对文件进行读操作而不能进行写操作

mode模式:

Python对Linux系统的操作,打开文件与读写文件,python模拟linux的cp操作

 

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. 将/bin/ls“拷贝”到/root/目录下
  2. 不要修改原始文件

1)小文件cp

  1. #!/usr/bin/env python3
  2.  
  3. f1 = open('/bin/ls', 'rb')
  4. f2 = open('/root/ls', 'wb')
  5.  
  6. data = f1.read()
  7. f2.write(data)
  8.  
  9. f1.close()
  10. f2.close()

 

提示:打开的文件必须存在,新文件不需要存在(将自动被创建) ,这里的话f1必须是存在的,不要求f2存在

2)大文件cp

  1. [[email protected] day03]# vim cp2.py
  2. #!/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保存文件名)