python文件I/O
使用Path
获取目录
from pathlib import *
# 获取当前目录
p = Path('.')
# 遍历当前目录下所有文件和子目录
for x in p.iterdir():
print(x)
# 获取上一级目录
p = Path('../')
# 遍历上级目录下的所有文件和子目录
for x in p.iterdir():
print(x)
# 获取上级目录及其所有子目录下的.py文件
for x in p.glob('**/*.py'):
print(x)
使用os.path
操作目录
import os
import time
# 获取文件绝对路径
print(os.path.abspath("os.path.py"))
# 获取目录
print(os.path.dirname('python/test/os.path.py'))
# 判断文件是否存在
print(os.path.exists('python/test'))
# 获取文件大小
print(os.path.getsize('os.path.py'))
# 判断是否为文件
print(os.path.isfile('os.path.py'))
# 判断是否为目录
print(os.path.isdir('python/test'))
# 判断文件是否相同
print(os.path.samefile('os.path.py','./os.path.py'))
# 获取文件最后一次访问时间
print(time.ctime(os.path.getatime('os.path.py')))
# 获取文件最后一次修改时间
print(time.ctime(os.path.getmtime('os.path.py')))
# 获取文件创建时间
print(time.ctime(os.path.getctime('os.path.py')))
使用fnmatch
处理文件名匹配
import fnmatch
from pathlib import *
for file in Path('.').iterdir():
if fnmatch.fnmatch(file,'*.py'):
print(file)
使用fnmatch.filter()
进行列表过滤
names = ['a.py','b.py','c.py','d.py']
sub = fnmatch.filter(names,'[ac].py')
print(sub) # ['a.py', 'c.py']
使用famatch.translate()
转化为正则表达式
print(fnmatch.translate('?.py')) # (?s:.\.py)\Z
使用open()
打开文件
f = open('./os.path.py')
print(f.encoding) # UTF-8
print(f.name) # ./os.path.py
print(f.mode) # r
print(f.closed) # False
读取文件
默认读取全部文件内容
f = open("os.path.py",'r',True)
print(f.read())
显式指定字符集
f = open("os.path.py",'r',True,'utf-8')
print(f.read())
按字节或字符读取
f = open("os.path.py",'r',True)
while True:
ch = f.read(1)
if not ch : break
print(ch,end='')
f.close()
f = open("os.path.py",'r',True)
try:
while True:
ch = f.read(1)
if not ch : break
print(ch,end='')
finally:
f.close()
以二进制的方式读取
f = open("os.path.py",'rb',True)
print(f.read().decode('utf-8'))
f.close()
按行读取文本
文件
逐行读取
f = open("os.path.py",'r',True,'utf-8')
while True:
line = f.readline()
if not line : break
print(line,end='')
f.close()
一次读取所有行
f = open("os.path.py",'r',True,'utf-8')
for l in f.readlines():
print(l,end='')
f.close()
使用fileinput
读取多个输入流
import fileinput
for line in fileinput.input(files=('open-test.py','Path-test.py')):
# 输出文件名,当前行在当前文件中的行号,当前行内容
print(fileinput.filename(),fileinput.filelineno(),line,end='')
fileinput.close()
文件迭代器
文件对象本身是可遍历的,可以使用for-in
循环遍历文件内容
f = open('os.path.py','r',True,'utf-8')
for line in f:
print(line,end='')
f.close()
将文件对象转化为list
对象
print(list(open('os.path.py','r',True,'utf-8')))
使用with
语句自动关闭文件
with open('os.path.py','r',True,'utf-8') as f:
for line in f:
print(line,end='')
写文件
文件写入模式
r+
w
w+
a
a+
都可以写入文件,r+
w
w+
打开文件时,文件指针位于文件开头处;a
a+
打开文件时,文件指针位于文件结尾处;w
w+
写入文件时会立即清空文件内容
文件指针
test.txt
文件
abcdefghijklmnopqrstuvwsyz
f = open("test.txt")
# 判断文件指针位置
print(f.tell()) # 0
# 将文件指针移动到第3处
f.seek(3)
print(f.read(1)) # d
write()
写入内容
以字符串方式写入
import os
f = open('test.txt','w+')
f.write('python' + os.linesep)
# writelines()写入多个字符串
f.writelines(('aaaaaa' + os.linesep,
'bbbbbbbb' + os.linesep
))
此时的test.txt
文件
python
aaaaaa
bbbbbbbb
以二进制方式写入
import os
f = open('test.txt','wb+')
f.write(('python' + os.linesep).encode('utf-8'))
f.writelines((('aaaaaa' + os.linesep).encode('utf-8'),
('bbbbbbbb' + os.linesep).encode('utf-8')
))
目录函数
创建目录
import os
# 获取当前目录
print(os.getcwd())
# 在当前目录下创建子目录
path = 'test_dir'
os.mkdir(path)
# 递归创建目录
path2 = 'a/b/c'
os.makedirs(path2)
删除目录
import os
# 删除path对应的空文件,若目非空,则抛出OSError异常
path = 'test_dir'
os.rmdir(path)
# 删除非空文件
os.remove('test.txt')
# 递归删空目录
path = 'a/b/c'
os.removedirs(path)
目录重命名
import os
# 目录重命名
path = 'd'
os.rename(path,'e')
# 递归重命名目录
path2 = 'a/b'
os.renames(path2,'a/f')