1.文件基本操作
文件读取三部曲: 打开 -----操作------关闭
r:
- 只能读, 不能写;
- 读取的文件不存在, 会报错;
r+:
- 可以执行读写操作;
- 文件不存在, 报错;
- 默认情况下, 从文件指针所在位置开始写入;
w:
- write only
- 文件不存在, 不报错
- 会清空文件内容
w+:
- rw
- 文件不存在, 不报错
- 会清空文件内容
a:
- write only
- 文件不存在, 不报错
- 不会清空文件内容
a+:
- rw
- 文件不存在, 不报错
- 不会清空文件内容
这里的报错是因为没有文件 ‘hello2’所以无法读取
这里的报错是因为,只给了读的权限,所以不能进行写的操作
读取文件成功
当文件不存在时,会自动生成一个新文件
这里显示的是添加字符的数量
先读取后显示,最后关闭文件
2.非纯文本文件的读取
# 如果读取图片, 音乐或者视频(非文本文件), 需要通过二进制的方式进行读取与写入;b
"""
- 读取二进制文件
rb:rb+:wb:wb+:ab:ab+:
- 读取文本文件
rt:rt+:wt:wt+:at:at+ 等价于 r:r+:w:w+:a:a+
"""
# 先读取二进制文件内容, 保存在变量content里面
f1 = open("frame1.png", mode='rb')
content = f1.read()
f1.close()
# print(content)
f2 = open('hello.png', mode='wb')
f2.write(content)
f2.close()
3.文件常用属性
buffer是一个缓冲区对象
closed 检测的是文件是否关闭
fileno 显示的是文件号
name 文件对象
最后一个是文件信息
4.文件常用方法
readline 显示的是一行的内容
read(3) 显示的是文件前三个字符
因为文件读取后,指针会停留在原地
这里的 tell 显示指针位置 ; seek(0,0)是让指针归零 ; seek(0,2) 是让指针放在文件末尾
添加时会在指针位置处开始添加 如上图
5.文件读取之with语句
在python3中
这是将1文件的内容转录到2文件中,打印的是2文件的内容
在python2中可以分两次打开并转录
6.yield实现大文件读取
7.os之环境变量函数
结果如图
8.文件读写练习
创建文件 data.txt 文件共10000行,每行存放1~100之间的有一个整数
9.遍历指定目录下的所有内容
10.os之文件操作函数
# 1. 判断是否为绝对路径---'/tmp/hello', 'hello.png', 'qq/hello.mp3'
import os
import random
from os.path import exists, splitext, join
# print(os.path.isabs('/tmp/hello'))
# print(os.path.isabs('hello'))
#
# # 2. 生成绝对路径
# print(os.path.abspath('/tmp/hello'))
# print(os.path.abspath('hello.png'))
#
# # 3. 'hello.png'
# print(os.path.join('/home/kiosk', 'hello.png'))
# # 返回一个绝对路径: 当前目录的绝对路径+ 文件名/目录名
# print(os.path.join(os.path.abspath('.'), 'hello.png'))
#
#
# # 4.获取目录名或者文件名
# filename = '/home/kiosk/Desktop/201808python/day10/hello.png'
# print(os.path.basename(filename))
# print(os.path.dirname(filename))
# 5. 创建目录/删除目录
# mkdir -p qq/qq1/qq1 递归创建目录
# os.makedirs('img/films')
# os.mkdir('img')
# os.rmdir('img')
# 6. 创建文件/删除文件
# os.mknod('00_ok.txt')
# os.remove('00_ok.txt')
# 7. 文件重命名(mv)
# os.rename('data.txt', 'data1.txt')
# # 8. 判断文件或者目录是否存在
# print(os.path.exists('img'))
#
# # 9. 分离后缀名和文件名
# print(os.path.splitext('hello.png'))
# print(os.path.split('hello.png'))
#
# # 10. 将目录名和文件名分离
# print(os.path.split('/tmp/hello/hello.png'))
# # 练习:
# # 1. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png)
# # 2. 将当前img目录所有以.png结尾的后缀名改为.jpg.
#
# import string
#
# def gen_code(len=4):
# # 随机生成4位的验证码
# li = random.sample(string.ascii_letters+string.digits, len)
# # 将列表元素拼接为字符串
# return "".join(li)
#
# def create_files():
# # 随机生成100个验证码
# li = {gen_code() for i in range(100)}
#
# os.mkdir('img')
# # # 随机生成四个数字
# for name in li:
# os.mknod('img/' + name + '.png')
#
#
from collections import Iterable
import sys
def modify_suffix(dirname, old_suffix, new_suffix):
"""
:param dirname: 操作的目录
:param old_suffix: 原先的后缀名
:param new_suffix: 新的后缀名
:return:
"""
# 1. 判断查找的目录是否存在, 如果不存在, 显示报错
if exists(dirname):
# 2. 找出所有以old_suffix(.png)结尾的
# pngfiles = [ filename for filename in os.listdir(dirname)
# if filename.endswith(old_suffix)]
pngfiles = filter(lambda filename: filename.endswith(old_suffix), os.listdir(dirname))
# 3. 将文件名和后缀名分开, 留下所有的文件名
basefiles = [splitext(filename)[0] for filename in pngfiles]
print(basefiles)
# 4. 文件重命名
for filename in basefiles:
# 需要加上目录名
oldname = join(dirname, filename+old_suffix)
newname = join(dirname, filename+new_suffix)
os.rename(oldname, newname )
print("%s重命名为%s成功" %(oldname, newname))
else:
print("%s不存在, 不能操作......" %(dirname))
# 如果该脚本没有被调用, 则执行下面的代码;
if __name__ == '__main__':
# **** 如何在执行脚本时, 接收用户传入的参数;
# 判断用户传的参数是否为3个参数?
if len(sys.argv) == 4:
dirname = sys.argv[1]
old_suffix = sys.argv[2]
new_suffix = sys.argv[3]
# modify_suffix('img', '.png', '.jpg')
modify_suffix(dirname, old_suffix, new_suffix)
else:
print("""
Usage: %s dirname old_suffix new_suffix
""" %(sys.argv[0]))
11.小插曲
程序代码如下