在python中如何读取linux系统中某个目录下的文件?读取后如何写入内容呢?
首先认识一下各种读写方式:
++++++++++++++++++++++++++++++++++++++++++++
【r:(默认)】
-只能读,不能写
-读取的文件不存在,会报错
读完指针停留在文件最后
++++++++++++++++++++++++++++++++++++++++++++
【r+:】
-可读写
-文件不存在,报错
-默认从文件指针所在位置开始写入
读完指针停留在文件最后
++++++++++++++++++++++++++++++++++++++++++++
【w:】
-只能写
-会清空文件之前的内容
-相当于重定向
-文件不存在,不会报错,会创建新的文件并写入
写完指针停留在文件最后
++++++++++++++++++++++++++++++++++++++++++++
【w+:】
-可读写
-会直接先清空文件内容
-相当于重定向
-文件不存在,不会报错,会创建新的文件并写入
写完指针停留在文件最后
++++++++++++++++++++++++++++++++++++++++++++
【a:】
-只能写
-文件不存在,不报错
-不会清空文件内容
-相当于追加
++++++++++++++++++++++++++++++++++++++++++++
【a+:】
-可读写
-文件不存在,不报错
-不会清空文件内容
-相当于追加
++++++++++++++++++++++++++++++++++++++++++++
对文件的使用:读:
步骤:
打开 —> 操作 —> 关闭
示例:
f = open('/tmp/passwd')
#首先我们先确认有/tmp/passwd这个文件
content = f.read() #将读取到的内容赋给content变量
prient(content) #打印读取到的内容
f.close() #关闭文件
这样就达成了在python中直接读取我们主机文件的功能。
我们上面有说r是默认的选择,即只读,不能写。
可以看到,产生不可写的报错。
我们可以使用:变量.readable()查看是否可读 || 变量.writeable()查看是否可写
当文件被读取过一次时,指针会移到文件的最后,那么第二次读取时则读不到内容了。
上面这个例子中,本希望读取到两次的/tmp/passwd文件,结果只读到了一次。
我们可以通过调节指针位置来达到二次读取:
指针位置在7是因为文件中还有一个$来指示结尾。
对文件的使用:写:
f = open('/tmp/passwd','w')
#w有写的权限,但是不可以读,且w在写之前会清空原文件内容
f.write('redhat')#写入一个字符串redhat
f.close()
运行结果:无报错,但是清空了我们原文件,然后写入redhat
w是没有读的权限的:不能使用变量.read()来在python中直接获取文件内容。
而w+拥有读和写的权限。
这里我们使用了f.seek()使指针到达文本的0位置,来使其向后读取文件内容。在后续会讲到seek方法。
对文件的使用:rb:打开二进制文件:使输出集中在一行:
这种方法将所有内容读取到一行,\n直接打印输出,而不执行。和readlines()方法相同
readline() 每次读取一行 ##逐行读取,指定参数使其读取指定数量的字符
readlines() 返回列表,其元素为每一行的内容
当直接readline(参数)的效果和read(参数)效果相同,都为直接输出指定数量的字符
上述的\n,我们可以使用strip()方法去除所有类型空格来去除:
f = open('/tmp/passwd','rb')
print([line.strip() for line in f.readlines()]) #列表生成式来生成去除空格的文本内容
f.close() #关闭文件
可以使用map内置函数,替换上一行代码:
print(list(map(lambda x:x.strip(),f.readlines())))
seek方法:移动指针位置:
1.seek第一个参数是偏移量:>0,代表向右移动,<0,代表向左移动
2.seek第二个参数是:
【 0:从文件开头开始移动】
【1:从当前位置开始移动】
【2:从文件末尾开始移动】
3.可以单独使用一个参数,默认是从头开始,向右移动指定位置。
注意:系统默认使用的模式只支持正向移动,不支持反向移动,也不支持第二个参数的1和2.需要改为b模式。
例如:f = open('/tmp/passwd','rb') #在b模式
非纯文本文件读写:
rb、rb+、wb、wb+、ab、ab+
图片:
f = open('redhat.jpg',mode='rb') #读模式
content = f.read() #读,但是图片读了是看不到的
f.close()
f1 = open('hello.jpg',mode='wb') #新建hello.jpg来打开查看原图
f1.write(content) #将刚才读到的图片内容content写到helo.jpg中
f1.close()
#之后可以在主机图形界面查看到hello.jpg这个图片
with方式读取文件:
省略关闭对象的步骤。
示例一:
with open('/tmp/passwd') as f: #with方式替换
print(f.read()) #打印读取的内容
示例二:
with open('/tmp/passwd') as f1,\
open('/tmp/passwd1','w+') as f2: #创建passwd1作为f2
f2.write(f1.read()) #f2中写入f1的内容
f2.seek(0,0) #调整指针位置
print(f2.read()) #打印f2