一、基本文件操作
1、创建和打开文件
格式:
file = open(filename,arguments)
#参数说明:
#file : 自定义,打开或创建文件在程序中的体现的形式
#filename : 写文件的直接路径或相对路径,如果有该文件,打开文件读取内容
# 当后面接了w,w+,a或者a+时,若没有该文件,则创建文件再打开文件
#arguments : 为参数,有r,rb,r+,w,wb,w+,a,ab,a+等
示例:
f = open('file', 'w') #只写模式打开当前目录下的文件file
2、关闭文件
打开文件后,需要及时关闭,以免对文件造成不必要的破坏。
格式:
file.close() #file为你打开文件时自定义的名字
3、打开文件时使用with语句
推荐:with语句在执行完毕后会自动关闭已经打开的文件
格式:
with expression as target:
with-body
#参数说明:
#expression:指定一个表达式,可以是打开文件的open()函数
#target:一个变量,将expression表达式中运行的结果保存到这个变量中
#with-body:with语句体,一些操作语句
示例:
with open('/mnt/file','r') as f:
print(f.read())
运行结果:
人生苦短,我学Python!
4、写入文件内容
![](/qrcode.jpg)
file.write(string) #file为你打开文件时自定义的名字
#string为写入的字符串
注意:要想写入信息,需要在打开文件时,指定打开模式为可写!
相关参数:
w :只写模式打开文件
w+ :打开文件后,先清空原有内容,在对此文件有读写权限
a :以追加模式打开一个文件(在文件内容的末尾写入)
a+ : 以读写模式打开文件(在文件内容的末尾写入)
5、读取文件
a)读取指定字符
read()
file.read([size]) #file为你打开文件时自定义的名字
#[size]为指定要读取的字符个数,如果不写,则读取全部内容
注意:使用read()方法的前提是,打开文件时,指定的模式为r(只读)或r+(读写)
示例:
with open('/mnt/file','r') as f:
print(f.read(4)) #读取前4个字节
#/mnt/file的内容为:人生苦短,我学Python!
运行结果:
人生苦短
使用read()方法读取文件时,是从文件的开头读取的。使用seek()方法可以将文件的指针移动到新的位置,结合起来就能根据自己的需求读取文件内容了。
seek()
file.seek(参数1,参数2)
#参数说明
#file:你打开文件时自定义的名字
#参数1:指定移动字符的个数
#参数2:指定从什么位置开始计算移动字符的个数
# 值为0时,表示从文件头开始计算
# 值为1时,表示从当前位置开始计算
# 值为2时,表示从文件尾开始计算
# 参数2不写时,默认为0
注意:如果打开文件时,没有使用rb模式,则只允许从文件头开始计算相对位置
示例:
with open('message.txt','r') as f:
print(f.read())
f.seek(6)
print(f.read(13))
运行结果:
Python的强大,强大到你无法想象!
的强大,强大到你无法想象!
b)读取一行
readline():每次读取一行
格式:
file.readlline() #file:你打开文件时自定义的名字
注意:需要指定打开模式为r(只读)或r+(读写)
示例:
with open('/mnt/fstab', 'r') as f:
number = 0
while True:
number += 1 #行号
print(number, f.readline()) #打印每一行的内容
if f.readline() == "":
break #跳出循环
运行结果:
1
2 # /etc/fstab
3 #
4 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
5 UUID=9c23ef0d-02f7-41d3-adb4-662af3530361 / xfs defaults 0 0
6 UUID=186e4d32-33db-4d1b-9676-b3cce4261d57 swap swap defaults 0 0
3、读取全部行
readlines:读取全部行,返回一个字符串列表,每一行的内容为一个元素
file.readlines() #file:你打开文件时自定义的名字
注意:需要指定打开模式为r(只读)或r+(读写)
示例:
with open('/mnt/fstab', 'r') as f:
print(f.readlines())
运行结果:
['\n', '#\n', '# /etc/fstab\n', '# Created by anaconda on Sun Mar 3 02:41:05 2019\n', '#\n', "# Accessible filesystems, by reference, are maintained under '/dev/disk'\n", '# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info\n', '#\n', 'UUID=9c23ef0d-02f7-41d3-adb4-662af3530361 / xfs defaults 0 0\n', 'UUID=fbbe7909-955c-48bb-823e-01d4a84f3f9a /boot xfs defaults 0 0\n', 'UUID=186e4d32-33db-4d1b-9676-b3cce4261d57 swap swap defaults 0 0\n']
文件较大时,采用这种方法输出文件的内容会很慢,可以逐行输出:
示例:
with open('/mnt/fstab', 'r') as f:
for line in f.readlines() :
print(line)
二、目录操作(os模块实现)
目录也称文件夹,用于分层保护文件。
1、os 和 os.path 模块
注意:不同的操作系统上运行,可能会得到不一样的结果!我以Linux为例
导入os模块
import os
#导入os模块后,也可以使用其子模块 os.path
导入os模块后,常用的变量有以下几个:
1)name:用于获取操作系统类型
import os
print(os.name)
运行结果:
如果是 posix #表示Linux、Unix或Mac OS操作系统
如果是 nt #表示Windows操作系统
2)linesep :用于获取当前系统上的换行符
import os
print(os.linesep)
3)sep:用于获取当前操作系统所使用的路径分隔符
import os
print(os.sep)
运行结果:
/
2、路径
用于定位一个文件或目录的字符串称为一个路径。
1)相对路径
当前目录:是指当前文件所在的目录,用 os.getcwd() 查看
import os
print(os.getcwd()) #输出当前目录
运行结果:
/root/PycharmProjects/allen/第十四章 文件与IO
相对路径 = 绝对路径 - 当前目录
2)绝对路径
绝对路径是指在使用文件时指定文件的实际路径
格式:
os.path.abspath(要获取绝对路径的相对路径)
示例:
import os
print(os.path.abspath('message.txt'))
运行结果:
/root/PycharmProjects/allen/第十四章 文件与IO/message.txt
3)拼接路径
如果想要将多个路径拼接到一起组成一个新的路径,可以使用join()函数
格式:
os.path.join(path1,path2,...,path n)
注意,使用join()拼接时,并不会检测路径是否真实存在
示例:
import os
print(os.path.join('/mnt','message.txt','dir'))
运行结果:
/mnt/message.txt/dir
3、判断目录是否存在
格式:
os.path.exists(dir_path)
#dir_path 为要判断的目录或文件,相对路径/绝对路径都可以
#存在 返回 True
#不存在 返回 False
示例:
import os
print(os.path.exists('/mnt'))
print(os.path.exists('/mnt/etc'))
运行结果:
True #存在
False #不存在
注:还能判断文件是否存在
4、创建目录
1)创建一级目录
格式:
os.mkdir('dir_path')
#dir_path 为要创建的目录或文件,相对路径/绝对路径都可以
示例:
import os
os.mkdir('/mnt/etc') #在/mnt下创建etc目录
运行后:
2)创建多级目录
格式:
os.makedirs('dir_path')
#dir_path 为要创建的目录或文件,相对路径/绝对路径都可以
示例:
import os
os.makedirs('/mnt/一级/二级/三级')
运行后:
5、删除目录
rmdir():只能删除空目录
格式:
os.rmdir('dir_path')
#dir_path 为要删除的目录或文件,相对路径/绝对路径都可以
示例:
import os
if os.path.exists('/mnt/etc') == True: #判断目录是否存在
os.rmdir('/mnt/etc') #删除/mnt/etc目录
else:
print('/mnt/etc不存在!')
运行后:
rmtree():可删除非空目录
import shutil #Python内置的标准模块shutil的rmtree()函数
shutil.rmtree('/mnt/一级')
运行后:
6、遍历目录
格式:
os.walk(top='path')
#path : 指定要遍历内容的根目录
#返回值:返回一个包含三个元素的元组生成器对象
示例:
import os
tuple=os.walk(top='/home/allen')
for i in tuple:
print(i,"\n")
运行部分结果:
('/home/allen/.mozilla', ['extensions', 'plugins'], [])
返回值: 元素一 元素二 元素三
当前遍历的路径(字符串) 当前路径下包含的子目录(列表) 当前路径下包含的文件(列表)
('/home/allen/.mozilla/extensions', [], [])
...
三、高级文件操作
1、删除文件
os.remove(file_path)
#file_path 为要删除的文件,相对路径/绝对路径都可以
示例:
import os
os.remove('/mnt/file') #删除/mnt/file文件
运行后:
2、重命名文件和目录
格式:
os.rename(file_path_name1,file_path_name2)
#file_path_name1 :为要重命名的文件,相对路径/绝对路径都可以
#file_path_name2 :为要重命名后的文件,相对路径/绝对路径都可以
示例:
import os
name1='/mnt/fstab'
name2='/mnt/fstab111'
if os.path.exists(name1) == True: #判断文件是否存在
os.rename(name1,name2) #重命名
print(name1+'已重命名为'+name2)
else:
print(name1+'不存在!')
运行结果:
/mnt/fstab已重命名为/mnt/fstab111
注意:
rename()函数也能重命名目录,不过是最后一级目录名称
3、获取文件基本信息
stat() 函数可以获取以下文件信息:
1)文件的最后一次访问时间----st_atime
2)最后一次修改时间-------------st_mtime
3)文件大小(单位为字节)--------st_size
4)设备名-----------------------------st_dev
5)用户ID-----------------------------st_uid
6)组ID--------------------------------st_gid
7)硬链接号(被连接数)------st_nlink
8)索引号----------------------------st_ino
格式:
os.stat(file_path)
#file_path 为要获取信息的文件,相对路径/绝对路径都可以
示例:
import os
if os.path.exists('/mnt/fstab111') == True:
f=os.stat('/mnt/fstab111')
print('/mnt/fstab111大小为',f.st_size,'B')
else:
print('/mnt/fstab111不存在!')
运行结果:
/mnt/fstab111大小为 501 B