文件操作
我们linux中使用python时是可以对linux中的文件系统进行读写操作的,当然其他例如windows系统同样适于
首先我们为了系统中文件的不损坏,我们将以/etc/passwd文件为示例,我们将其符之到/tmp下
现在我们对齐进行操作,需要注意的是我们必须得经历三个步骤打开——>操作——>关闭
示例:
#打开文件
f = open('/tmp/passwdd','w')
#读操作
# content = f.read()
# print(content)
# print(f.writable())
# print(f.readable())
#写操作
f.write('hello')
#关闭
f.close()
在这里的报错是因为我们对文件的操作是"w",是只写的,所以会报错,还有一种可能出现的报错是文件权限的问题,其报错和shell中很类似
文件的读写
在前面我们看到了w是只读,下面给大家介绍一下其所有的读写操作配置
r:(默认)
-只能读,不能写
-读取的文件不存在,会报错
r+:
-可以执行读写操作
-文件不存在,报错
-默认情况下,从文件指针所在位置开始写入
w:
-write only
-会清空文件之前的内容
-文件不存在,不会报错,会创建新的文件并写入
w+:
-rw
-会清空文件内容
-文件不存在,不报错,会创建新的文件
a:
-write only
-不会清空文件内容
-文件不存在,会报错
a+:
-rw
-不清空文件内容,在末尾追加
-文件不存在,不报错
我们重新恢复passwd文件,然后来看看文件中的指针
f = open('/tmp/passwd','r+')
#查看当前指针所在的位置
print(f.tell())
f.write('python')
print(f.tell())
content = f.read()
print(content)
f.close()
首先我们打开文件后其默认的指针在0,当我们通过覆盖开头的root:x为python后指针到了6,所以我们最后大引出文件内容时时没有python的,因为它打印的时从指针开始的
文件的读取操作
readlines():读取文件内容,返回一个列表,列表的元素分别为文件行内容
需要注意的是默认情况下读取文件的所有内容,小文件可以直接用read读取,如果是大文件(文件大小>内存大小),不能通过read一次性读取所有内容
文件的写操作
移动文件指针
seek方法,移动指针
seek的第一个参数是偏移量:>0,表示向右移动,<0表示向左移动
seek的第二个参数是:
0:移动指针到文件开头
1:不移动指针
2:移动指针到末尾
非纯文本文件的读取
**我们之前读取的所有文件都是纯文本文件,那么我们也会遇到很多非纯文本文件的读取,例如图片等,其实那些都可以理解为二进制文件的读取
读取二进制文件:rb rb+ wb wb+ ab ab+
**
使用with打开文本
首先我们可以不用使用每次都使用open和close,这样是的很麻烦,我们可以使用一种新的文本打开方式with
上下文管理器
我们在一些时候需要同时对两个文件进行操作,这是我们是可以使用with同时打开两个文件对其进行操作的
with open('/tmp/passwd') as f1,\
open('/tmp/passwd1','w+') as f2:
#将第一个文件的内容写入第二个文件中
f2.write(f1.read())
#移动指针到文件最开始
f2.seek(0)
#读取文件内容
print(f2.read())
在这里需要注意的是我们的passwd1本来是没有的,我们通过write将passwd的内容写入到新的passwd1中
python对于操作系统
1.返回操作系统类型
2.操作系统的详细信息
3.系统环境变量
4,通过key值获得相应的value值
5.判断是否为绝对路径
6.生成绝对路径
7。获取目录名或文件名
8.创建目录/删除目录
注意,如果目录下还有目录的话python时不可以用rmdir递归删除目录的
9.创建文件/删除文件
10.文件重命名
11.判断文件或目录是否存在
12.分离后缀名和文件名
13.分离目录名和文件名
文件系统练习
1.创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
import random
f = open('data.txt','w+')
for i in range(100000):
f.write(str(random.randint(1,100)) + '\n')
f.seek(0)
print(f.read())
f.close()
2. 在当前目录新建目录img, 里面包含100个文件, 100个文件名
各不相同(X4G5.png)
def gen_code(len=4):
#随机生成4位验证码
li = random.sample(string.ascii_letters + string.digits,len)
#将列表元素拼接为字符串
return ''.join(li)
def create_files():
#随机生成100个验证码
li = [gen_code() for i in range(100)]
os.mkdir('img')
for name in li:
os.mknod('img/' + name + '.png')
# create_files()
再上一题的基础上,将当前img目录所有以.png结尾的后缀名改为.jpg.
import random
import os
import string
def modify_suffix(dirname,old_suffix,new_suffix):
"""
:param dirname: 要操作的目录
:param old_suffix: 之前的后缀名
:param new_suffix: 新的后缀名
:return:
"""
if os.path.exists(dirname):
#找出所有以old_suffix结尾的文件名
pngfile = filter(lambda filename:filename.endswith(old_suffix),os.listdir(dirname))
#将文件名和后缀分开
basefiles = [os.path.splitext(filename)[0] for filename in pngfile]
#文件重命名
for filename in basefiles:
oldname = os.path.join(dirname,filename+old_suffix)
newname = os.path.join(dirname,filename+new_suffix)
os.rename(oldname,newname)
print('%s重命名为%s成功' %(oldname,newname))
else:
print('%s不存在,无法操作...' %dirname)
modify_suffix('img','.png','.jpg')