打开
相对路径:相对于哪一个目录下面的指定文件。
python文件所在目录。
r
如果文件不存在则会报错。
以只读的方式打开文件,这是默认模式。
文件的指针将会放在文件的开头。
f = open('a.txt','r')
content = f.read()
print(content)
f.close()
w
以只写的方式打开文件
文件的指针将会放在文件的开头,所以写入的新内容会覆盖
文件不存在,会自动创建一个新文件。
f = open('a.txt','w')
f.write('123456')
f.close()
a
以追加的方式(只写)打开文件
文件的指针会放在文件的结尾,所以写入的内容会增加文件末尾
文件不存在,会自动创建一个新文件。
f = open('a.txt','a')
f.write('123456')
f.close()
b
rb
wb
ab
以二进制格式进行文件读写操作,图片,视频,音频。
fromFile = open('xx.jpg', 'rb')
fromContent = fromFile.read()
fromFile.close()
toFile = open('xx2.jpg', 'wb')
content = fromContent[0:len(fromContent) // 2]
toFile.write(content)
toFile.close()
+
以读写模式进行打开。
其他特性基本和+前面的模式一致。
r+
f = open('a.txt', 'r+')
content = f.read()
print(content)
f.write('888888')
f.close()
xxx
123456
a.txt:
xxx
123456888888
读写
定位
f.seek(偏移量, [0,1,2]) 定位指针位置
0:开头,默认
1:当前位置
2:文件末尾
注意文本文件的操作模式下(不带b),只能写0.如果想要1/2,必须在二进制文件操作模式下
f.tell() 查看当前指针位置
a.txt
12345678
f = open('a.txt', 'r')
print(f.tell())
f.seek(2)
print(f.tell())
content = f.read()
print(content)
print(f.tell())
f.close()
0
2
345678
8
读
f.read(字节数)
字节数默认是文件字节长度
f.readline([limit])
读取一行数据,limit限制的最大字节数
a.txt
1
2
3
4
5
6
f = open('a.txt', 'r')
print('-', f.tell())
content = f.readline()
print(content, end='')
print('-', f.tell())
content = f.readline()
print(content, end='')
print('-', f.tell())
content = f.readline()
print(content, end='')
f.close()
- 0
1
- 3
2
- 6
3
f.readlines()
会自动将文件转换行符进行处理,将处理好的每一行组成一个列表返回
f = open('a.txt', 'r')
content = f.readlines()
print(content)
f.close()
[‘1\n’, ‘2\n’, ‘3\n’, ‘4\n’, ‘5\n’, ‘6\n’]
for in
f 为迭代器
import collections
f = open('a.txt', 'r')
print(isinstance(f, collections.Iterator))
for i in f:
print(i, end='')
f.close()
d:\python\python\test3.py:5: DeprecationWarning: Using or importing the ABCs from ‘collections’ instead of from ‘collections.abc’ is deprecated, and in 3.8 it will stop working
print(isinstance(f, collections.Iterator))
True
1
2
3
4
5
6
判定是否可读
f = open('a.txt', 'r')
if f.readable():
content = f.readlines()
for i in content:
print(i, end='')
f.close()
1
2
3
4
5
6
注意
一般文件特别大的时候,可以使用reafline 或 for in,按行加载,可节省内存,但相比于其他两个读取方式,性能较低。
其他两个方式,一次性读取文件所有内容,虽然占用内存,但处理性能比较高。
写
f.write(‘内容’)
返回值是写入的字节长度
判定是否可写 f.writable()
关闭
f.close()
可以释放系统资源,会立即清空缓冲区的数据内容到磁盘文件
f.flush()
立即将缓冲区写入磁盘
重命名
os.rename()
修改单级目录/文件名称
os.renames()
修改多级目录/文件名称
import os
# 修改文件
os.rename('a.txt', 'bb.txt')
# 修改目录
os.rename('first', 'one')
# os.renames()
os.renames('one/one.txt', 'two/two.txt')
删除
删除文件
os.remove()
文件不存在会报错
删除目录
os.rmdir()
不能递归删除目录,如果文件夹非空,会报错
os.removedirs()
可以递归删除目录,如果文件夹非空,会报错
import os
os.rmdir('two')
os.removedirs('one/one2')
创建文件夹
os.mkdir(‘文件夹名称’[, mode] )
不能递归创建
import os
os.mkdir('a')
os.mkdir('a/b')
os.mkdir('b', 0o777)
获取当前目录
os.getcwd()
改变默认目录
os.chdir(‘a’)
获取目录内容列表
import os
# 当前目录
os.listdir('./')
# 上一层目录
os.listdir('../')
文件的复制
大文件复制:
import os
os.chdir('files')
source_file = open('d.txt', 'r', encoding='utf-8')
dst_file = open('d_bat.txt', 'a', encoding='utf-8')
while True:
content = source_file.read(1024)
if len(content) == 0:
break
dst_file.write(content)
source_file.close()
dst_file.close()
文件分类,并生成文件清单
按照文件名后缀,划分到不同的文件夹。
生成.txt格式的文件清单
import os
import shutil
path = 'files'
if not os.path.exists(path):
exit()
os.chdir(path)
file_list = os.listdir('./')
print(file_list)
# 遍历所有的文件
for file_name in file_list:
# 分解文件的后缀名
# 获取最后一个.的索引位置
index = file_name.rfind('.')
if index == -1:
continue
# 根据这个索引位置,当作起始位置,来截取后续的所有字符串内容
extension = file_name[index + 1:]
print(extension)
# 查看是否存在同名的目录
if not os.path.exists(extension):
# 创建目录
os.mkdir(extension)
# 移动文件
shutil.move(file_name, extension)
def listFilesToTxt(dir, file):
# 列举出文件夹下的所有文件夹及子文件
file_list = os.listdir(dir)
for file_name in file_list:
new_fileName = dir + '/' + file_name
if os.path.isdir(new_fileName):
# print(new_fileName)
file.write(new_fileName + '\n')
listFilesToTxt(new_fileName, file)
else:
# print('\t' + file_name)
file.write('\t' + file_name + '\n')
# print('')
file.write('\n')
f = open('../list.txt','a')
listFilesToTxt('./', f)
f.close()