Python操作文件和目录
Python操作文件和目录
读写文件比较简单,有一点特别注意就好了
windows下Python默认打开的文件以gbk解码,而一般我们的文件是utf-8编码的,所以如果文本含有中文,就会出现异常或者乱码。此时手动添加encoding='utf-8'表示以utf-8的方式打开。
当然Python写入时候,也是默认以gbk的编码写入。而文件通常是utf-8格式保存的,所以若不指定写入的编码方式,一写入中文就是乱码了
with open('abc.txt', encoding='utf-8') as f:
print(f.read()) # 这样打开文件有中文也不怕
# 当然Python写入时候,默认以gbk的编码写入。而文件是utf-8格式保存的,所以不指定写入的编码方式,一写入中文就是乱码了
with open('abc.txt', 'w', encoding='utf-8') as f:
f.write('你好')
好了进入正题
os模块
当前工作目录
下面的代码可获取/切换当前工作目录,也就是.代表的路径
import os
print(os.getcwd()) # F:\PythonProject
os.chdir(r'D:\python')
print(os.getcwd()) # D:\python
print(os.path.abspath('.')) # D:\python
# 由于工作目录切换到D:\python,所以这个aa.txt就在其下生成
with open('aa.txt', 'w', encoding='utf-8') as f:
f.write('你好')
os.chdir可以切换当前的工作目录,也就是改变了.所指向的目录。于是相对路径aa.txt就在切换后的路径下生成。这两个路径表达同一个意思
aa.txt.\aa.txt
还有两个点,表示当前目录的父目录。..\aa.txt这样就是D:\aa.txt的意思了。
绝对路径和相对路径
- 绝对路径指的是从根文件夹子(盘符)开始
- 相对路径是相对于当前工作目录
print(os.path.abspath('aa.txt')) # D:\python\aa.txt
print(os.path.isabs('aa.txt')) # False
print(os.path.isabs('.')) #False
上面的代码,第一个函数返回参数路径的绝对路径,第二个函数用于检查一个路径是否是相对路径。
获取最后一个斜杠前后的路径。
# 获取最后一个斜杠后面的部分
print(os.path.basename(r'D:\python\aa.txt')) # aa.txt
print(os.path.dirname(r'D:\python\aa.txt')) # D:\python
# 当然使用下面的函数可以同时获得以上两者
print(os.path.split(r'D:\python\aa.txt')) # ('D:\\python', 'aa.txt')
以其他方式分割
print(os.path.splitext(r'D:\python\aa.txt')) # ('D:\\python\\aa', '.txt')
print(os.path.splitdrive(r'D:\python\aa.txt')) # ('D:', '\\python\\aa.txt')
os.path.splitext这个函数以可以方便地获取文件后缀名,如果提供地路径是文件夹,那么返回空。
os.path.splitdrive以盘符作为分隔。
注意,它们都返回元组。
检查路径
检查一个路径存不存在,是文件?还是文件夹?
print(os.path.isfile('D:\python')) # False
print(os.path.isdir('D:\python')) # True
print(os.path.exists('D:\python')) # True
创建文件夹
os.mkdir('D:\good') # True 只能建立一级不存在的目录,若已存在会报错
os.mkdir('D:\good\job') # True 注释掉上一句,由于D:\good已经存在,这里相当于还是只新建了一级不存在的目录
os.mkdir(r'D:\aa\bb') # 报错!!由于aa和bb文件夹都不存在,找不到D:\aa路径,故不能创建
os.makedirs(r'D:\aa\bb') # 此函数没有上上面的限制,管他存不存在一股脑儿创建,反正最后会生成此路径就是了。不过如果此路径已经存在了,就会报错了
由此可以看出os.makedirs更常用,可以创建处路径里所有的文件夹。而os.mkdir还必须保证上级目录存在,所以只能新建一级目录。
连接路径
print(os.path.join(r'D:\python', 'aa.txt')) # D:\python\aa.txt
这个函数也很常用,用于连接两个路径,组合成新路径返回。
遍历文件夹
# 返回元组,分别是当前文件夹路径, 当前路径下的子文件夹,当前路径下的文件
for current_path, subfolders, filesname in os.walk(r'D:\Cleaner'):
print(f'{current_path}\n{subfolders}\n{filesname}')
print('-'*30)
os.walk可以递归遍历给定路径下所有地文件和文件夹。看下该目录下这个函数会打印什么。这个函数会返回一个元组,分别是(当前路径, 该路径下的所有文件夹, 该路径下的所有文件),然后不断递归深入,不断返回这样的元组。所以上面的for循环执行了多次,直到路径最深处。
D:\Cleaner
['CCleaner']
['desktop.ini']
------------------------------
D:\Cleaner\CCleaner
['Lang']
['branding.dll', 'business.dat', 'CCleaner.dat', 'CCleaner.exe', 'ccleaner.ini', 'CCleaner64.exe', 'portable.dat']
------------------------------
....
删除文件/文件夹
# 永久删除,不进入回收站
os.remove(r'D:\aaaa.txt') # same as os.unlink()
# 目录为空才能删除, 只是删除当前文件夹
os.rmdir(r'D:\aaa\bbb\ccc\eee')
# 这个方法也不能删除非空目录,但是删除了空文件夹子eee后若发现父级文佳夹也空就一并删除
os.removedirs(r'D:\aaa\bbb\ccc\eee') # 剩下D:\aaa\bbb
# 强力,该目录下所有文件/文件夹全部删除,不管内容空不空。慎用
shutil.rmtree(r'D:\aaa')
重命名
# 重命名文件夹,必须保证原路径存在,目标路径不能已存在
os.rename(r'D:\python', 'D:\good')
# 重命名文件,必须保证原路径存在,目标路径不能已存在
os.rename(r'D:\good\aa.txt', r'D:\good\bb.txt')
# 上面都不能再目标地址存在的情况下使用,这个函数粗暴,如果目标路径已存在,则会覆盖之,慎用
os.replace(r'D:\good\bb.txt', r'D:\good\cc.txt')
获取文件的大小
得到文件的大小,以字节为单位
print(os.path.getsize(r'D:\good\cc.txt'))
shutil模块
os模块的功能相当强大,但是还有部分功能,比如复制/剪切文件和文件夹存在与shutil模块中。
直接看代码吧
copy
# 如果Movie目录存在,则是把这个文件复制到了该目录下。
des1 = shutil.copy(r'D:\findall.txt', r'E:\Movie')
# 如果没有该目录,则新建Mov文件,无后缀名
des2= shutil.copy(r'D:\findall.txt', r'E:\Mov')
# 当然指定了后缀名,就把源文件复制过去并重命名
des2= shutil.copy(r'D:\findall.txt', r'E:\Mov.txt')
# copy只复制最后访问时间
des3 = shutil.copy(r'D:\findall.txt', r'E:\findit.txt')
# copy2同时拷贝所有元数据包括修改时间和最后访问时间
des4 = shutil.copy2(r'D:\findall.txt', r'E:\find.txt')
# 不拷贝访问时间和修改时间
des5 = shutil.copyfile(r'D:\findall.txt', r'E:\findaa.txt')
# 可以看到返回的是新文件所在的路径
print(f'{des1}\n{des2}\n{des3}')
# 拷贝整个文件夹(里面所有内容)到另外一个文件夹,该文件夹不能是已经存在的文件夹
shutil.copytree(r'D:\abc', r'E:\Movie')
move
# 剪切文件, abc不存在就移动文件并改名为abc, abc目录存在则放入该目录
shutil.move(r'D:\findall.txt', r'E:\abc')
# 目标地址若是文件,则是移动并重命名
shutil.move(r'D:\findall.txt', r'E:\aa.txt')
# 剪切文件夹,如果目标目录已经存在,则剪切并放入该目录,如果目标目录不存在,则相当于移动目录到目标地址并重命名文件夹
shutil.move(r'D:\abc', r'E:\avb')
ok,对文件和目录的操作也是日常生活中经常会使用到的。学习了这些已经可以自动完成很多操作了。
by @sunhaiyu
2017.6.26
Python操作文件和目录的更多相关文章
- python操作文件和目录查看、创建、删除、复制
python内置了os模块可以直接调用操作系统提供的接口函数,os.name查询的是操作系统,‘nt’表示windows系统 >>> import os >>> o ...
- 【Python】[IO编程]文件读写,StringIO和BytesIO,操作文件和目录,序列化
IO在计算机中指Input/Output,也就是输入和输出. 1.文件读写,1,读文件[使用Python内置函数,open,传入文件名标示符] >>> f = open('/User ...
- Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化
IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...
- 【转】Python之文件与目录操作(os、zipfile、tarfile、shutil)
[转]Python之文件与目录操作(os.zipfile.tarfile.shutil) Python中可以用于对文件和目录进行操作的内置模块包括: 模块/函数名称 功能描述 open()函数 文件读 ...
- Python学习笔记(二十五)操作文件和目录
摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319253241 ...
- python学习笔记 操作文件和目录
如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...
- python的I/O编程:文件打开、操作文件和目录、序列化操作
1 文件读写 1.1 打开文件: open(r'D:\text.txt') 1.2 文件模式 值 功能描述 'r' 读模式 'w' 写模式 'a' 追加模式 'b' 二进制模式 '+' 读写模式 1. ...
- Python操作文件、文件夹、字符串
Python 字符串操作 去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sSt ...
- IO编程(2)-操作文件和目录
操作文件和目录 如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只 ...
随机推荐
- 常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全
innerHTML: 设置或获取位于对象起始和结束标签内的 HTML scrollHeight: 获取对象的滚动高度. scrollLeft: 设置或获取位于对象左边界和窗口中目前可见内容的 ...
- 【2017-06-27】Js中获取地址栏参数、Js中字符串截取
一.Js中获取地址栏参数 //从地址栏获取想要的参数 function GetQueryString(name) { var reg = new RegExp("(^|&)" ...
- 用awk写递归
看到自己很多年前写的一篇帖子,觉得有些意义,转录过来,稍加修改. awk是一种脚本语言,语法接近C语言,我比较喜欢用,gawk甚至可以支持tcp/ip,用起来非常方便. awk也支持递归,只是awk不 ...
- Swift大写和小写字符串
您可以通过字符串的 uppercaseString 和 lowercaseString 属性来访问一个字符串的大写/小写版本. 复制纯文本新窗口 let normal = "Could yo ...
- 关于ZendStudio 10.5的破解
一. 下载ZendStudio 10.5 首先下载ZendStudio 10.5 我使用的是mac版 下载地址是: http://downloads.zend.com/studio-eclipse/1 ...
- java执行程序的内存分析系列专栏二之static变量和方法内存分析
昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能 ...
- Java IO学习笔记(三)转换流、数据流、字节数组流
转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和 ...
- mysql中的limit
mysql中常使用limit做分页查询,使用方法也很简单: SELECT * FROM table LIMIT [offset,] rows #注: offset-偏移量,rows查询返回的行数 -- ...
- python编程快速上手之第9章实践项目参考答案
本章介介绍了shutil,zipfile模块的使用,我们先来认识一下这2个模块吧. 一.shutil模块 shutil模块主要用于对文件或文件夹进行处理,包括:复制,移动,改名和删除文件,在shuti ...
- 快学Scala之特质
一个Scala类可以继承多个特质(trait), 特质可能会要求使用它们的类支持某个特定特性, 与Java接口不同, Scala特质可以给出这些特质的缺省实现. 要点如下: Scala中类只能继承一个 ...