首页 > 技术文章 > 3.文件和目录

journeyer-xsh 2020-07-03 10:08 原文

一、字符编码

常见编码格式和区别:Unicode:4个字节,utf-8:8位一个字节表示英语,24位(3个字节表示中文和其他语言),gbk:英文一个字节,中文两个字节

数据在内存中都是以Unicode编码的,但是网络传输或存储到硬盘中时必须非Unicode

二、文件的打开或创建

文件变量名=open(文件名[,打开方式[,缓冲区]])

mode 说明 注意
r 只读方式打开 文件必须存在
w 只写方打开 文件不存在则创建新文件,文件存在会清空内容后再写入
a 追加方式打开 文件不存在则创建
r+/w+ 读写方式打开 可读可写。文必须存在,不会自动创建,写为追加再文件内容末尾。
a+ 追加和读写方式打开 一般不能直接读取,因为此光标再文件末尾,必须有移动到初始位置或非末尾的位置。
rb,wb,ab,wb+,ab+ 二进制文件打开方式,同上

以a或r开头是安全模式,不会删除原来的内容,以w开头的是危险模式,会删除原来内容

三、文件的读

f = open('f.txt', encoding='utf-8', mode='r')
content = f.read(5) # 按照字符读
content = f.readline() # 读一行
l1 =f.readlines() # 读每一行,返回一个列表,列表中的每一个元素是源文件的每一行
print(l1)
# for读取
for line in f:
  print(line)
# open方式打开需要手动关闭文件句柄
f.close()

四、文件的写

# 有文件在源文件的最后追加
f = open('文件',encoding='utf-8', mode='a')
# write()传入的必须是字符串
f.write('an')
f.write('bn')
f.close()

注意事项:文件的最小单位是字节,文件中存在一个文件指针(表现为文件中闪烁的光标)

五、常用方法

文件(对象)句柄

print(f.readline())    # 打印一行
print(f.readline(5))   # 打印前5个字符
print(f.tell())        # 打印当前指针位置
print(f.read())        # 读完文件后,指针在最尾处
f.seek(0)              # 如要重头到尾再读,文件指针须先回到文件头(0-文件头,默认值; 1-当前位置; 2-文件尾)
print(f.read())        # 重读文件
print(f.encoding)      # 打印当前使用的字符编码
print(f.name)          # 打印文件名
print(f.flush())       # 刷新
f.truncate()           # 清空文件
f.truncate(12)         # 从头开始,第12个字符后截断并清除
f.close()              # 关闭文件

文件操作方法

文件的基本操作需要os模块和os.path模块

path:路径,filename:文件的绝对路径,如:'D:\a.txt',当前目录下的文件直接指定文件名即可。

os.path中常用的文件处理函数。

函数名 说明
abspath(path) 返回path所在的绝对路径
dirname(path) 返回目录的路径
exists(path) 判断文件是否存在
getatime(filename) 返回指定文件的的最近访问时间
getctime(path) 返回指定文件的创建时间
getmtime(path) 返回指定文件的最新的修改时间
getsize(filename) 返回指定文件的大小,单位是字节
isdir(path) 判断是否为文目录
isfile(path) 判断是否为文件
split(path) 分割文件名与路径并返回一个列表
splitext(path) 从路径中分割文件的拓展名
walk(top,func,arg) 遍历目录数

getatime()、getctime()、getmtime()返回的都是时间戳。可通过time.gmtime([sec])转换的得到一个对象,再通过该对象的tm_year,tm_mon,tm_mday等属性获取相应时间或日期

os模块下常用的文件操作函数

os.remove(filename) # 删除文件

os.listdir() # 列出当前目录的所有文件,返回一个列表,如['an.txt','bn.txt','cn.txt']

os.rename('要修改的文件、目录名', '修改后的文件、目录名') # 文件或目录的重命名

六、使用with操作文件

# 不指定mode,默认为rt模式。即只读文本,as表示取别名
with open('an.txt',encoding='utf-8')as f:
  f.write('str')
  print(f.read())
# 这种方式的好处在于不用手动关闭文件句柄,即不写f.close()

七、目录操作

目录操作需要os模块,若path只指定了目录名,则在该py文件同目录下创建。

目录创建

mkdir(path) # 创建一个指定目录,paht为该文件的绝对路径

mkdirs(path1,path2...) # 创建多个目录

目录删除

os.rmdir("dir") # 只能删除空目录

shutil.rmtree() # 空目录、非空目录都能删除,需导入shutil模块

os.removedirs(path1,path2...) # 删除多级目录

os.removedirs('./olddir/newdir')

目录遍历

1、listdir(path)

查看指定目录下的文件及目录信息。

import os
print(os.listdir(r'D:\Other')) # ['an.txt', 'bn.py', 'cn.md', 'newdir']

这只是返回了Other这个目录下的文件和目录,但是newdir目录下的文件和目录没有打印,如下利用递归函数即可实现。

# 获取该目录下的所有文件名
def get_file(path):
    ret = os.listdir(path)
    for name in ret:   #name 文件名
        abs_name = os.path.join(path,name)  # 完整路径名
        if os.path.isfile(abs_name):
            print(name)
        else:
            get_file(abs_name)

2、os.walk()

返回该路径下的所有文件及子目录信息元组,将该信息分成文件、目录逐行显示。

import os
list_dir = os.walk(path)
# os.walk返回一个元组,包括三个元素,所有路径名、所有目录列表与文件列表
for root,dirs,files in list_dir:
  # 遍历目录
  for d in dirs:
    print(os.path.join(root,d))		# 获取完整的路径
  # 遍历文件
  for f in files:
    print(os.path.join(root,f))
# 
# D:\Other\newdir
# D:\Other\an.txt
# D:\Other\bn.py
# D:\Other\cn.md
# D:\Other\newdir\太阳.jpg

八、shutil模块

import shutil
# 拷贝文件
# shutil.copy2('原文件', '现文件')
# shutil.copy2('file', 'temp')

# 拷贝目录
# shutil.copytree("原目录", "新目录", ignore=shutil.ignore_patterns("*.pyc"))
# shutil.copytree("/Users/jingliyang/PycharmProjects/面试题/常用模块/logging模块", "logging模块2", ignore=shutil.ignore_patterns("__init__.py"))

# 删除目录
# shutil.rmtree("temp", ignore_errors=True)
# shutil.rmtree("logging模块2", ignore_errors=True)

# 移动文件/目录
# shutil.move("logging模块", "logging2", copy_function=shutil.copy2)

# 获取磁盘使用空间
# total, used, free = shutil.disk_usage(".")
# print("当前磁盘共: %iGB, 已使用: %iGB, 剩余: %iGB"%(total / 1073741824, used / 1073741824, free / 1073741824))
#
# 压缩文件
# shutil.make_archive('压缩文件夹的名字', 'zip','待压缩的文件夹路径')
# shutil.make_archive('logging2', 'zip','/Users/jingliyang/PycharmProjects/面试题/常用模块/随机数')

# 解压文件
# shutil.unpack_archive('zip文件的路径.zip','解压到目的文件夹路径')
# shutil.unpack_archive('/Users/jingliyang/PycharmProjects/面试题/常用模块/shutil模块/logging2.zip','/Users/jingliyang/PycharmProjects/面试题/常用模块/shutil模块/tmp')

推荐阅读