Python文件和目录操作整理
Published:
将常用的Python文件和目录操作整理了一下,包括文件和文件夹的读写、创建删除、复制移动,还有一些像文件、文件夹的过滤等其他的小技巧。
读写text数据
with open(filename, 'rt', encoding='utf-8') as f:
data = f.read()
with open(filename, 'rt', encoding='utf-8') as f:
for line in f:
print(line)
with open(filename, 'wt', encoding='utf-8') as f:
f.write(text1)
with open(filename, 'wt', encoding='utf-8') as f:
# 也可以使用print函数,指定file参数即可
print(text1,file=f)
如果是追加模式,wt
换成at
即可。
使用sys.getdefaultencoding()
可以获取到系统默认的编码方式,一般是utf-8
。
尽量使用with
来操作文件,因为它自动帮你管理了文件的打开和关闭,如果是不用with
,自己不要忘记了关闭文件。
newline=''
参数消除了由于不同操作系统的换行符的差异。
with open(filename, 'rt', encoding='utf-8',newline='') as f:
...
使用print
函数的时候,注意使用sep
和end
参数,可以提供很多方便。
比如我们要将
row = ('acme', 50, 91.5)
连接起来输出,因为str.join()
函数要求所有的参数必须是str
类型,所以如果使用str.join()
,那么需要多做一些工作。
row = ('acme', 50, 91.5)
print(','.join(str(x) for x in row))
如果合理使用print
的sep
参数,那么实现同样的效果,代码是
print(*row, sep=',')
读写二进制数据
with open(filename, 'rb') as f:
data = f.read()
with open(filename, 'wb') as f:
f.write(b'Hello World')
with open(filename, 'rb') as f:
data = f.read(16)
text = data.decode('utf-8')
with open(filename, 'wb') as f:
text = 'Hello World'
f.write(text.encode('utf-8'))
小技巧
如果要求对一个不存在的文件进行写操作,而存在的文件则不进行操作。(这样可以防止覆盖了已存在文件的内容)
常规写法:
import os
if not os.path.exists(filename):
with open(filename, 'wt') as f:
f.write('Hello\n')
else:
print('File already exists!')
更简单的写法,使用open
的x
模式
with open(filename, 'xt') as f:
f.write('Hello\n')
读写gzip或者bz2压缩文件
import gzip
with gzip.open(filename, 'rt') as f:
text = f.read()
import bz2
with bz2.open(filename, 'rt') as f:
text = f.read()
import gzip
with gzip.open(filename, 'wt', compresslevel=5) as f:
f.write(text)
import bz2
with bz2.open(filename, 'wt', compresslevel=5) as f:
f.write(text)
处理路径问题
import os
path='C:\\User\\yan\\paper.txt'
print(os.path.basename(path))
print(os.path.dirname(path))
print(os.path.splitext(path))
Output:
paper.txt
C:\User\yan
('C:\\User\\yan\\paper', '.txt')
判断文件或文件夹是否存在
os.path.exists(filename)
os.path.isfile(filename)
os.path.isdir(dirname)
os.path.islink(linkname)
os.path.realpath(path)
os.path.getsize(filename)
os.path.getmtime(filename) #文件修改时间
import time
time.ctime(os.path.getmtime(filename)) #转换为易读的方式
os.listdir(dirname) # 列出dir所有的文件
过滤查找文件或文件夹
import os
#获取所有的文件
file_names = [name for name in os.listdir(dirname) if os.path.isfile(os.path.join(dirname,name))]
#获取所有的文件夹
dir_names = [name for name in os.lsitdir(dirname) if os.path.isdir(os.path.join(dirname,name))]
#获取所有的python文件
py_names = [name for name in os.listdir(dirname) if name.endswith('.py')]
#获取所有的python文件
import glob
py_names = glob.glob('dirname/*.py')
#获取所有的python文件
from fnmatch import fnmatch
py_names = [name for name in os.listdir(dirname) if fnmatch(name,'*.py')]
新建文件和删除文件
open(filename, 'wt').close() #创建一个空文件
os.remove(filename)
复制和移动文件
import shutil
shutil.copyfile(oldfilename, newfilename) #两个参数必须是文件名,不能是文件夹
shutil.copy(oldfilename, newfilename)
shutil.copy(oldfilename, foldername) #copy第二个参数既可以指定文件名,也可以指定文件夹名
文件夹操作
获取当前的工作文件夹
os.getcwd()
改变当前工作文件夹
os.chdir(dirname)
新建文件夹
os.mkdir(dirname) #创建单级目录
os.makedirs(dirname/subdirname) #创建多级目录
os.makrdirs(dirname/subdirname,exist_ok=True) #如果文件夹已经存在,则不会报错
删除文件夹
os.rmdir(dirname) #删除单级空目录
os.removedirs(dirname/subdirname) #删除多级空目录
import shutil
shutil.rmtree(dirname) #删除目录,不管是空还是非空,是单级目录还是多级目录
复制文件夹
shutil.copytree(oldfoldername, newfoldername)
移动文件夹/文件
shutil.move(oldpos, newp)