目录
6、os.scandir获取文件名、文件路径、判断是否文件夹
import os
import shutil
# 创建单个文件夹
# os.mkdir("text")
# 创建多个文件夹
# d_list=['a','b','c']
# for i in d_list:
# os.makedirs(i)
# 判断路径是否存在
# print(os.path.exists('text'))
# 如果不存在就创建
# if not os.path.exists('text'):
# os.mkdir('text')
# 路径拼接
# print(os.path.join('D:\python\办公自动化\自动发送邮件', "demo.py", )) # D:\python\办公自动化\自动发送邮件\demo.py
# print(os.path.join('D:\python\办公自动化\自动发送邮件', "案例", "demo.py", )) # D:\python\办公自动化\自动发送邮件\案例\demo.py
# 获取当前路径下的所有文件
# print(os.listdir('D:\python\办公自动化\自动发送邮件')) # ['python登入.py']
# 获取当前路径下的所有文件和文件夹,可返回文件名,路径,是否文件夹
# for file in os.scandir(r"D:\demo"):
# print(file.name, file.path, file.is_dir())
# if file.is_dir():
# pass
# else:
# print(file.name)
# 删除文件
# os.remove('text.py')
# 删除空文件夹
# os.rmdir('text')
# 删除非空文件夹
# shutil.rmtree('text')
# 复制、移动
# 移动文件shutil.move(源文件路径,目标文件路径)
# shutil.move(r"D:\python\办公自动化\自动发送邮件\text.py","D:\python\办公自动化")
# 复制文件 shutil.copy(源文件路径,目标文件路径) copyfile功能一样
# shutil.copy(r"D:\python\办公自动化\text.py",r"D:\python\办公自动化\自动发送邮件\text.py")
# shutil.copyfile(r"D:\python\办公自动化\text.py",r"D:\python\办公自动化\自动发送邮件\text.py")
# 复制文件夹
# shutil.copytree(r"D:\python\办公自动化\text",r"D:\python\办公自动化\自动发送邮件\text")
# 修改文件
# os.rename('原名称',"新名称")
# 将文件名和扩展名分开(通过索引返回)
os.path.splitext(r"C:\Users\HP\Desktop\商业分析.xlsx")
# 返回:('C:\\Users\\HP\\Desktop\\商业分析', '.xlsx')
1、批量创建文件夹
import os
file = r"C:\Users\Administrator\Desktop\测试"
name = ['城北','城东','城南','城西','红光','红岭','黄排','蕉田','金光','莲花','南湖',
'青云','泰园','园岭','湖榕','惠园','福田','华侨城','百丘田','陈塘','碧山','光明','坣陂','三联','六德']
for i in name:
if not os.path.exists(file + "/" + str(i)):
os.mkdir(file + "/" + str(i)) # 指定路径
else:
print('文件夹已存在')
2、创建多个层级目录
import os
file = r"C:\Users\Administrator\Desktop\测试"
if not os.path.exists(file + "/" + '1/2/3/4/5/6/7/8'):
os.makedirs(file + "/" + '1/2/3/4/5/6/7/8')
print('创建成功')
else:
print('目标路径已存在')
3、当前路径下创建多个层级目录
os.path.dirname(__file__) # 当前文件的文件夹
import os
start_path = os.path.dirname(__file__) # 当前文件的文件夹
target_path = os.path.join(start_path,'demo1/demo2/demo3')
print(target_path)
if not os.path.exists(target_path):
os.makedirs(target_path)
print('创建成功')
else:
print('目标路径已存在')
4、创建文件
import os
name_list = ['杨幂',"杨迪",'杨紫','杨洋']
file = r"C:\Users\Administrator\Desktop\测试"
for name in name_list:
file_name = file + "/" + name + ".text"
with open(file_name,"w",encoding='utf-8') as f1:
f1.write(name)
5、文件整理
根据后缀整理文件到相应的文件夹中
import os
import shutil
def move_file(type_file):
# 原路径
old_path = os.path.join(base_path, filename) # C:\Users\Administrator\Desktop\测试\bbb.mp4
# 目标路径
new_path = os.path.join(base_path, type_file, filename) # C:\Users\Administrator\Desktop\测试\视频
# 移动文件
shutil.move(old_path, new_path)
# 待处理的文件路径
base_path = r"C:\Users\Administrator\Desktop\测试"
# 准备存放文件的文件夹
list1= ['视频','Excel',]
for name in list1:
# 路径拼接
path = os.path.join(base_path,name)
# 文件夹创建
if not os.path.exists(path):
os.mkdir(path)
else:
print('文件夹已存在')
# 处理文件
# 获取当前路径下的所有文件
file_list = os.listdir(base_path)
# 循环所有文件
for filename in file_list:
# 过滤不需要的文件夹,不要文件夹的文件
if filename not in list1:
src_type = filename.split('.')[-1]
if src_type == "mp4":
move_file('视频')
elif src_type == "xlsx" or src_type == "xls":
move_file('Excel')
else:
pass
6、os.scandir获取文件名、文件路径、判断是否文件夹
import os
for file in os.scandir(r"D:\demo"):
print(file.name, file.path, file.is_dir()) # os.is_dir()是文件夹
if file.is_dir():
pass
else:
print(file.name)
7、glob层级搜索
glob.glob
import glob
path = r"D:\demo\层级"
# 同层级搜索
for file in glob.glob(path + "/*"):
print(file)
# 多层级搜索
for file in glob.glob(path + "/**",recursive=True):
print(file)
8、获取指定路径
os.path.expanduser
os.path.join(os.path.expanduser("~"),"Desktop") # 获取桌面路径
os.path.join(os.path.expanduser("~"),"Desktop/text") # 获取桌面text文件夹路径
os.path.join(os.path.expanduser("~"),"Desktop/demo.xlsx") # 获取桌面demo.xlsx路径
9、open操作文件
f = open(r"C:\Users\HP\Desktop\新建 文本文档.txt","r",encoding="utf-8") # 读取文件
f.close() #关闭文件
# encoding非必填项,utf-8或者gbk等
打开模式 | 描述 |
' r ' | 只读模式,如果文件不存在,返回异常FileNotFoundError,默认值 |
'w' | 覆盖写模式,文件不存在则创建,存在则完全覆盖原文件。str,not int |
'x' | 创建写模式,文件不存在则创建,存在则返回异常FileExistsError |
'a' | 追加写模式,文件不存在则创建,存在则原文件最后追加内容 |
' b ' | 二进制文件模式 |
' t ' | 文本文件模式,默认值 |
'+' | 与r / w/ x/ a一同使用,在原功能基础上增加同时读写功能 |
二进制文件通常包含原始字节,没有特定的编码格式
图片文件、视频文件、声音文件等非结构文件通常以二进制形式存储,需要特定解码器程序才能正确打开
文件操作-常用组合
- 以文本方式只读打开一个文件,读入后不能对文件进行修改:r
- 以文本方式可读写地打开一个文件,可以读入并修改文件:r+
- 以文本方式打开一个空文件,准备写入一批内容,并保存为新文件:w
- 以文本方式打开一个空文件或已有文件,追加形式写入一批内容,更新原文件:a+
- 以二进制方式只读打开一个文件,读入后不能对文件进行修改:rb
文件操作-读
方法 | 描述 |
f.read(size) | 从文件中读入整个文件内容。参数可选,如果给出,读入前size长度的字符串或字节流 |
f.readline(size) | 从文件中读入一行内容。参数可选,如果给出,读入该行前size长度的字符串或字节流 |
f.readlines(hint) | 从文件中读入所有行,以每行为元素形成一个列表。参数可选,如果给出,读入hint行 |
f.seek(offset) | 改变当前文件操作指针的位置,offset的值:0为文件开头;1为从当前位置开始;2为文件结尾 |
读取中文文本
f = open("test.txt","rt",encoding = "UTF-8") # 中文UTF-8,相对路径
s = f.read() # 返回字符串,整个文件的内容
f.close()
读取用python写入的文件,在打开时是无需用解码器encoding。
读取段落
file = r"C:\Users\HP\Desktop\新建 文本文档.txt"
d = open(file,"rt",encoding="UTF-8")
s=d.readline()
print(s) # 返回段落一,此刻光标在段落一结尾,结尾处有换行\n
s=d.readline()
print(s) # 返回段落二,
d.close()
file = r"C:\Users\HP\Desktop\新建 文本文档.txt"
d = open(file,"rt",encoding="UTF-8")
s=d.readlines() # ['啊沙发上aaaa\n', '撒打发bbbb']
print(s)
d.close()
read 和readlines 同时读取
d = open(file,"r",encoding="UTF-8")
s=d.read()
print(s)
l=d.readlines()
print(l) # 返回空列表,因为光标在结尾了
d.close()
# 修改光标/指针位置
d = open(file,"r",encoding="UTF-8")
s=d.read()
print(s)
d.seek(0) # 指针在文件开头
l=d.readlines()
print(l)
d.close()
练习1:把列表写入文件中
# 把列表写入文件中
ls =["北京","上海","深圳","广州"]
f=open(r"C:\Users\HP\Desktop\city.csv","w") # w只能写入str
f.write(",".join(ls))
f.close()
练习2:读取文件输出列表
# 文件:北京,上海,深圳,广州
f=open(r"C:\Users\HP\Desktop\city.csv","r")
s = f.read()
f.close()
print(s.split(",")) # ['北京', '上海', '深圳', '广州']
文件的操作-写
方法 | 描述 |
f.write(s) | 向文件写入一个字符串或字节流 |
f.writelines(lines) | 将一个元素为字符串的列表整体写入文件 |
write方法:新建文件并写入两行
file = r"C:\Users\HP\Desktop\new.txt"
d =open(file,"w")
d.write("aaaa\n") #不能写入空白否则报错
d.write("bbbb\n")
d.close()
writelines方法:列表形式写入,覆盖原文件
file = r"C:\Users\HP\Desktop\new.txt"
d =open(file,"w")
d.writelines(["aaaa","bbbb"]) # 写入 aaaabbbb
d.close()
a 打开模式:追加
file = r"C:\Users\HP\Desktop\new.txt"
d =open(file,"a")
d.writelines(["ccc\n","ddd\n"])
d.close()
python创建的文件无需encoding解码
相对路径/绝对路径
相对路径:同个目录下,可省略路径只保留文件名
绝对路径:路径+文件名