操作系统的文件分为:
(1)文本文件:.txt
(2)二进制文件:.mp3、.wma、.doc
运用open函数来获得 文件对象
格式为:open(file,mode)
file: 泛指文件和文件夹,
相对路径:从当前路径开始的路径
绝对路径:从盘符开始的路径如:“E:\test”
mode模式说明:
r:(1)读模式(默认模式),用来读取文件内容。文件指针在文件的开头。文件需要事先存在,否则会产生异常。
w:(1)写模式,用来向文件写入数据。文件指针在文件的开头。如果文件存在,则覆盖文件,否则会创建文件。
a:(1) 追加模式,用来向文件追加数据。文件指针在文件的末尾。如果文件存在,不会覆盖文件(追加写入),否则会创建文件。
x:(1) 写模式,用来向文件写入数据。文件指针在文件的开头。如果文件不存在,创建文件,否则产生错误。
t:(2) 文本(字符串)模式(默认模式),以文本形式操作文件。
b:(2) 二进制(字节)模式,以二进制形式操作文件。
U:(3) 通用换行符模式(已不建议使用)。在该模式下,\n,\r\n或\r都会解析为换行符。不能与w、a、x或+模式同时使用(仅限于读取文件时使用)。
+:(3) 读取或写入。
(1)(2)(3)模式中,不同组的模式可同时使用、(1)默认值是r、(2)默认值是t
f = open(r"E:\test\test1.txt","rt")
print(f)
关闭文件的几种方法:
(1)直接关闭
(2)try finally中
(3)with打开和关闭 (推荐)
使用with打开文件 with open(…) as 文件对象名1, open(…) as 文件名2
with open(r"E:\test\test1.txt","r") as f1, open(r"E:\test\test2.txt") as f2:
print(f1.read())
print(f2.read())
输出:
hello python2hello python2
hello python2hello python2
(1) read(size): size不写或者-1代表将文件内容全部读出,size>0整数 读取对应的字节
with open(r"E:\test\test1.txt","r") as f:
print(f.read())
输出:
hello python
浣犲ソpython
如果要正确的显示出中文字符,需要加上encoding="utf-8"
参数
如下所示:
with open(r"E:\test\test1.txt","r",encoding="utf-8") as f:
print(f.read())
输出:
hello python
你好python
文件对象是迭代器,当读取到文件的末尾,无法再读取任何内容,返回空
如下文本信息为abc
with open(r"E:\test\test1.txt","r",encoding="utf-8") as f:
print(f.read(1))
print(f.read(1))
print(f.read(1))
print(f.read(1))
输出:
a
b
c
**(2)readline()**返回文件的一行,保留原文档中\n,将\n也认为是读取的内容
如下文本信息为:
hello1
hello2
hello3
代码执行情况如下:
with open(r"E:\test\test1.txt","r",encoding="utf-8") as f:
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
输出:
hello1
hello2
hello3
(3)readlines() 返回一个列表,每一个元素都是文件中的一行
with open(r"E:\test\test1.txt","r",encoding="utf-8") as f:
print(f.readlines())
输出:
['hello1\n', 'hello2\n', 'hello3\n']
(4)通常如果文件过大,我们使用for循环的方式对文件对象进行迭代,文件会按行输出
文本信息为:
hello1 hello2
hello2
hello3
代码执行情况为:
with open(r"E:\test\test1.txt","r",encoding="utf-8") as f:
for i in f:
print(i,end="")
输出:
hello1 hello2
hello2
hello3
(1)write(content)方法
with open(r"E:\test\test1.txt","w+",encoding="utf-8") as f:
f.write("hello2")
(2)writelines(lines) :将lines列表中的内容写入文件
with open(r"E:\test\test1.txt","w+",encoding="utf-8") as f:
f.writelines(["hello1\n","hello2\n"])
文件的指针:
当r或者w模式的时候,指针的位置是在文件的开头0(空文件也在0的位置)
当a模式的,指针的位置在文件末尾最后一个字符的下一个位置。
with open(r"E:\test\test1.txt","r",encoding="utf-8") as f:
print(f.tell())
with open(r"E:\test\test2.txt","w",encoding="utf-8") as f:
print(f.tell())
with open(r"E:\test\test3.txt","a",encoding="utf-8") as f:
print(f.tell())
输出:
0
0
6
(1)tell: 返回指针的位置,即下一个要读取或者要写入字节的位置
with open(r"E:\test\test1.txt","r",encoding="utf-8") as f:
print(f.tell())
f.read(1)
print(f.tell())
输出:
with open(r"E:\test\test1.txt","r",encoding="utf-8") as f:
print(f.tell())
f.read(1)
print(f.tell())
**(2)seek(offset,whence)*改变指针位置
offset:指定偏移量
whence:指定偏移量参照位置:
0 SEEK_SET-----从文件头开始计算
1 SEEK_CUR-----从文件当前的位置
2 SEEK_END-----从文件尾开始计算
对于whence=0的时候,可以指定b模式或者t模式
对于whence=1或2时候,只支持b模式,当t模式的是,偏移量只能是0才是有效的
如下代码文本信息为012345
with open(r"E:\test\test1.txt","br") as f:
print(f.read(1))
print(f.tell())
f.seek(3,0)
print(f.tell())
print(f.read(1))
f.seek(0,0)
print(f.tell())
print(f.read(1))
f.seek(1,1)
print(f.read(1))
f.seek(-1,2)
print(f.read())
输出:
b'0'
1
3
b'3'
0
b'0'
b'2'
b'5'
t模式下对于whence=1或2时候,只支持b模式,当t模式的是,偏移量只能是0才是有效的
with open(r"E:\test\test1.txt","tr") as f:
print(f.read(1))
print(f.tell())
f.seek(3,0)
print(f.tell())
print(f.read(1))
f.seek(0,0)
print(f.tell())
print(f.read(1))
f.seek(0,1)
print(f.read(1))
f.seek(0,2)
print(f.read())
print(f.tell())
输出:
0
1
3
3
0
0
1
6
(1) mkdir: 父目录必须存在,被创建的目录必须不存在,否则报错
import os
os.mkdir(r"E:\test\mkdir_test")
import os
os.mkdir(r"E:\test1\mkdir_test")
输出:
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'E:\\test1\\mkdir_test'
(2)makedirs: 父目录可以不存在,会同时创建父目录
import os
os.makedirs(r"E:\test1\mkdir_test")
(3)rmdir:删除空目录
os.rmdir(r"E:\test1\mkdir_test")
(4)删除空目录,删完还会查看父目录是否也为空,如果也为空,则删除父目录,直到文件夹不为空为止
import os
os.makedirs(r"E:\test1\mkdir_test")
os.removedirs(r"E:\test1\mkdir_test")
(5)删除文件,如果文件不存在,也不会报错
import os
os.remove(r"E:\test\test1.txt")
(6)rename 重命名文件或者目录
import os
os.rename(r"E:\test\test2.txt",r"E:\test\test22.txt")
(7)renames (剪切粘贴)重命名文件,可以应用不同的路径下(不能运用在不同磁盘中):
相当于把原来路径下的内容删掉,在新路径下新创建一个文件
import os
os.renames(r"E:\test\test22.txt",r"E:\test1\test22.txt")
os.remove(r"E:\test1\test22.txt")
os.rmdir(r"E:\test1")
**(8) getcwd()**返回当前工作目录
import os
cur_path = os.getcwd()
print(cur_path)
(9) walk 遍历路径下的文件
会显示每一层文件的情况
(1)dirpath: string 代表目录的路径,起始路径
(2)dirnames :list 包含dirpath下的所有子目录名字
(3)filenames:list 包含非目录文件的文件名
实际储存结构如下:
t = os.walk(r"E:\test")
for roots,dirs,files in t:
print(roots,end="\t[roots]\n")
print(dirs,end="\t[dirs]\n")
print(files,end="\t[files]\n")
输出:
E:\test [roots]
['test1'] [dirs]
['test3.txt'] [files]
E:\test\test1 [roots]
[] [dirs]
['test1_next.txt'] [files]
(10)显示参数路径下的第一层目录名字,包括文件个路径(文件夹)
import os
t = os.listdir(r"E:\test")
print(t)
输出:
['test1', 'test3.txt']
**(1)abspath(path):**返回当前文件所在绝对路径
print(os.path.abspath("."))
(2)basepath返回路径中最后面部分,以/分隔符为准(只是字符串的处理,忽略路径是否真实存在)
import os.path
print(os.path.basename(r"E:\test\test1"))
输出:
test1
**(3)commonpath:**返回列表中所有路径的最长公共路径
import os.path
print(os.path.commonpath([r"E:\test\test1",r"E:\test\test2"]))
输出:
E:\test
(4)exist 判断路径是否存在
import os.path
print(os.path.exists(r"E:\test\test1"))
输出:
True
(5)返回目录或者文件的最后访问时间,修改时间
import os.path
print(os.path.getatime(r"E:\test\test3.txt"))
print(os.path.getctime(r"E:\test\test3.txt"))
输出:
1596352967.0744138
1596352552.2928417
(6)getsize获得文件的大小 字节为单位
import os.path
print(os.path.getsize(r"E:\test\test3.txt"))
输出:
6
(7)判断是否存在目录或者文件
import os.path
print(os.path.isdir(r"E:\test\test3.txt"))
输出:
False
(8)join路径的拼接
绝对路径前的元素都去掉
空元素会去掉
print(os.path.join("abc", "c:/", "def", "", "ghi"))
输出:
c:/def\ghi
(9)拆路径: dirname和basename
import os.path
print(os.path.split("c:/abc/def/ghi.jpg"))
输出:
('c:/abc/def', 'ghi.jpg')
(1)复制:复制内容
如果目标文件夹不存在,不会报错也不会执行
import shutil
shutil.copy(r"E:\test\test3.txt",r"E:\test\test1")
(2)copy2 把元信息都复制,包含文件的创建时间等等信息
import shutil
shutil.copy2(r"E:\test\test3.txt",r"E:\test\test1")
(3)copytree 复制目录,连同子目录和文件都复制
目标文件不能存在,否则报错:
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'E:\\test\\test2'
shutil.copytree(r"E:\test",r"E:\test\test2")