1. 文件操作
文件的操作方式有 打开文件, 读文件, 写文件, 关闭文件. 还会涉及一些系统路径, 路径下的文件夹和文件列表... 操作.
2. 辅助功能
对文件和文件夹的相关操作涉及到 os 模块 和 shutil 模块.
赋值方式 |
含义 |
os.listdir(“E:”) |
返回 E 盘目录下所有文件和目录 |
os.remove(“E:\a.txt”) |
删除 E 盘目录下的 a.txt 文件 |
os.removedirs(“E:\dir”) |
移除 E 盘目录 下的 dir 目录 Note: dir 目录下不能存在文件和文件夹 |
os.path.isfile(“E:\dir”) |
检查路径是否为文件, 是则返回 True, 否则返回 False |
os.path.isdir(“E:\dir”) |
检查路径是否为文件夹, 是则返回 True, 否则返回 False |
os.path.isabs(“E:\dir”) |
检查是否是绝对路径, 是则返回 True, 否则返回 False |
os.path.exists(“E:\dir”) |
检查路径是否存在, 是则返回 True, 否则返回 False |
os.path.split(“E:\dir\a.txt”) |
将路径切分开来, 例子返回 (‘E:\dir’, ‘a.txt’) |
os.path.splitext(“E:\dir\a.txt”) |
将文件名和文件类型分开来, 例子返回 (‘E:\dir\a’, ‘.txt’) Note: 如果路径为文件夹, 则类型为空 |
os.path.dirname(“E:\dir\a.txt”) |
获取当前路径的上级目录路径 |
os.path.basename(“E:\dir\a.txt”) |
获取当前路径的文件名或文件夹名 |
os.system(“dir”) |
运行 shell, 执行内建指令, 例子返回当前执行路径下的文件和文件夹 |
os.getenv(“JAVA_HOME”) |
获取环境变量, 传入变量名, 返回环境变量的路径 |
os.putenv(“TEST”, “E:\”) |
设置环境变量 |
os.name |
获取平台名 windows 返回 ‘nt’, Linux 返回 ‘posix’ |
os.mkdir(“E:\dir”) |
指定路径下创建文件夹 |
os.mkdirs(“E:\dir\subdir”) |
指定路径下创建多级文件夹 |
os.rmdir(“E:\dir”) |
只能删除空目录 |
os.chdir(“E:\dir”) |
切换路径到 E:\dir |
os.stat(“E:\a.txt”) |
获取文件的属性 |
os.chmod(“E:\a.txt”, stat.S_IXOTH) |
更改文件或目录的权限, 例子是修改 a.txt 的权限为其它用户有执行权限 |
os.path.getsize(“E:\a.txt”) |
获取文件大小, 单位为字节 |
shutil.copy(“oldfile”, “newfile”) |
oldfile 只能为文件夹, newfile 可以为文件或文件夹 |
shutil.copyfile(“oldfile”, “newfile”) |
oldfile 和 newfile 都只能为文件 |
shutil.copytree(“olddir”, “newdir”) |
oldfile 和 newfile 都只能为文件夹, 且 newfile 必须不存在 |
shutil.move(“oldpos”, “newpos”) |
移动文件或文件夹 |
shutil.rmtree(“dir”) |
不管目录是否为空, 都可以删除 |
3. 打开文件
打开文件方式共有如下几种
fp = open("E:\\a.txt", "r") // 只读方式打开 a.txt 文件
打开方式 |
含义 |
r |
读方式 |
w |
写方式 |
a |
追加方式, 不存在时会自动创建文件 |
r+ |
读写方式, 参见 r |
w+ |
读写方式, 参见 w |
a+ |
读写方式, 参见 a |
rb |
二进制读方式, 参见 r |
wb |
二进制写方式, 参见 w |
ab |
二进制追加方式, 参见 a |
rb+ |
二进制读写方式, 参见 r+ |
wb+ |
二进制读写方式, 参见 w+ |
ab+ |
二进制读写方式, 参见 a+ |
4. 读文件
读方式 |
含义 |
fp.read(size) |
size 为要读取的长度, 单位为字节 |
fp.readline()/fp.readline(size) |
读一行数据, 如果传入了 size, 可能返回一行的一部分 |
fp.readlines()/fp.readlines(size) |
文件的每行为 list 的一个成员, 返回 list, 内部也是调用 readline(), 如果传入 size, 则表示读取内容的总长, 则只会读到文件的一部分 |
5. 写文件
写方式 |
含义 |
fp.write(str) |
str 为要写入的数据, write() 不会自动在 str 后面添加换行符 |
fp.writelines(seq) |
把seq 内容写入文件中, 也不会在每行后面添加任何东西 |
6. 文件辅助
辅助方式 |
含义 |
fp.flush() |
把缓冲区的内容写入磁盘 |
fp.fileno() |
返回长整型的 “文件标签” |
fp.isatty() |
Linux 系统中用于 减产文件是否为终端设备文件 |
fp.tell() |
返回文件操作的当前位置, 已文件的开头为起点 |
fp.next() |
返回下一行, 并将文件操作标记移到下一行, 把一个 file 用于 for … in file 这样的语句时, 就是调用 next() 函数实现遍历的 |
fp.seek(off, whence) |
将文件偏移到 off 位置, off 为正, 则表示往后偏移, 为负, 则表示往前偏移 whence 代表从哪里开始计算偏移, 0: 表示从开头, 1: 表示从当前位置, 2: 表示从文件末尾 |
fp.truncate(size) |
把文件裁剪为 size 大小, 默认是裁到当前位置, 如果 size 比文件的大小还大, 则不改变文件, 也可能是用 0 把文件补到相应大小, 也可能是添加随机内容 |
7. 文件操作示例
示例为解析文件的内容, 并按指定的格式输出在终端显示
import os
fileDir = os.getcwd()
filePath = fileDir + "\\log.txt"
print(filePath)
file_Info_Size = (0x04 + 0x04 + 0x04 + 0xC80)*2
def analyze_mf(content):
print("**************************** MF Info Start ****************************")
off = 0
print("MF/DF/EF Common_Domain")
head_Array = [4, 2, 2, 2, 8]
head_Fid = content[off:(off+head_Array[0])]; off += head_Array[0]
head_Num = content[off:(off+head_Array[1])]; off += head_Array[1]
head_Class = content[off:(off+head_Array[2])]; off += head_Array[2]
head_Ac = content[off:(off+head_Array[3])]; off += head_Array[3]
head_OemId = content[off:(off+head_Array[4])]; off += head_Array[4]
print("\n head_Fid = %s\n head_Num = %s\n head_Class = %s\n head_Ac = %s\n head_OemId = %s\n" \
%(head_Fid, head_Num, head_Class, head_Ac, head_OemId) )
print("MF Private_Domain")
mf_Array = [128, 128, 32, 64, 64, 4, 4, 8, 8, 8, 8]
mf_Manufacturer = content[off:(off+mf_Array[ 0])]; off += mf_Array[ 0]
mf_Issuer = content[off:(off+mf_Array[ 1])]; off += mf_Array[ 1]
mf_Model = content[off:(off+mf_Array[ 2])]; off += mf_Array[ 2]
mf_Label = content[off:(off+mf_Array[ 3])]; off += mf_Array[ 3]
mf_SerialNumber = content[off:(off+mf_Array[ 4])]; off += mf_Array[ 4]
mf_HwVersion = content[off:(off+mf_Array[ 5])]; off += mf_Array[ 5]
mf_FirmwareVersion = content[off:(off+mf_Array[ 6])]; off += mf_Array[ 6]
mf_AlgSymCap = content[off:(off+mf_Array[ 7])]; off += mf_Array[ 7]
mf_AlgAsymCap = content[off:(off+mf_Array[ 8])]; off += mf_Array[ 8]
mf_AlgHashCap = content[off:(off+mf_Array[ 9])]; off += mf_Array[ 9]
mf_DevAuthAlgId = content[off:(off+mf_Array[10])]; off += mf_Array[10]
print("\n mf_Manufacturer = %s\n mf_Issuer = %s\n mf_Model = %s\n mf_Label = %s\n mf_SerialNumber = %s\n mf_HwVersion = %s\n mf_FirmwareVersion = %s\n mf_AlgSymCap = %s\n mf_AlgAsymCap = %s\n mf_AlgHashCap = %s\n mf_DevAuthAlgId = %s\n" \
%(mf_Manufacturer, mf_Issuer, mf_Model, mf_Label, mf_SerialNumber, mf_HwVersion, mf_FirmwareVersion, mf_AlgSymCap, mf_AlgAsymCap, mf_AlgHashCap, mf_DevAuthAlgId) )
print("MF Key_Domain---SM4")
mf_Sm4_Array = [32, 32, 32, 32]
mf_Sm4_Dev_Auth = content[off:(off+mf_Sm4_Array<