Python基础14-文件操作

2018-05-15  本文已影响11人  Jacob_LJ

Python基础-文件操作)

1 文件使用流程

1.1 打开

# open("文件", "模式")
f = open("a.text", "r")

# 文件:指定文件路径
# 模式:控制操作模式
模式 r w a r+ w+ a+
创建文件
覆盖内容
指针在开头
指针在末尾
默认模式
 r、w、a 默认用于处理文本文件
b :以二进制格式进行操作文件读写。如果文件是二进制文件,则选择此项。如:图片、视频、音频
所以,rb、wb、ab 模式就是用于处理二进制文件的,权限与 r、w、a 一样。

1.2 读写

f.seek(offset, whence)

# offset 指定开始位置从1开始
# whence 取值范围 0,1,2
# 0 代表开头,默认值 
# 1 代表当前位置
# 2 代表文件末尾
# 注意
* 文本文件的操作模式下(不带b),只能写0
* 如果想要写1或2,必须在二进制文件操作模式下(带b) 
通过cmd+点击跳进函数方法,seek 函数没有描述,则可以通过下面步骤查看 seek 函数描述
f.tell() 
content = f.read()
# f.read(字节数)
#   字节数默认是文件内容长度
#   下标会自动后移

content = f.readline()
# f.readline([limit])
#   读取一行数据
#   limit
#       限制的最大字节数

content = f.readlines()
# f.readlines()
#   会自动的将文件按换行符进行处理
#   将处理好的每一行组成一个列表返回

f.readable()
# 判断是否可读

  1. 通过 open() 返回的句柄 f 是一个迭代器,可通过 isinstance(f, collection.iterator) 进行判断,需要导入 collection 模块。
  2. 因为文件句柄 f 是迭代器,那么它的数据处理并不是马上生成所有数据,而是需要的时候才产生(参考迭代器的使用)
  3. read() 和 readlines()方法都是读取全部内容,对于处理大容量文件要小心内存,但正因为全部加载进内存,也方便了后续多次对数据的处理
  4. readline() 逐行读取,for in 方法遍历 句柄 f等,它们适用于处理大数据文件
  5. 假设文件的内容并没有换行符,此时,使用的 readline() 或 for in 方法都是读取整个文件的,那么最保险的做法即使通过 read(n) 方法来指定读取字节数来分段处理
writeContent = f.write("xxxyyyy")
# 返回值是写入的字节长度
# 写完后,指针位置在文件末尾

f.writeable()
# 判断是否可写

1.3 关闭

f.close()
# 关闭一个打开的文件
# 关闭的原因:
* 可以释放系统资源
* 会立即清空缓冲区的数据,立即将内容写入到磁盘文件(因为写入的内容并非立即写入文档的,这样的机制是用于减少 I/O 频率)
* 如果不关闭的话,会存在丢失数据的风险

f.flush()
# 立即将缓冲区内容写入到文件中

1.4 相关例子代码

# 1. 打开文件
# 相对路径, 相对于哪一个目录下面的指定文件
f = open("a.txt", "r+")

# 2. 读写操作
content = f.read()
print(content)

f.write("88888")

# 3. 关闭文件
f.close()

2 文件相关操作

improt os
os.rename(src, dst)
# os.rename("b.text", "xx.text")
# os.rename("wenjianjia", "wenjianjia2")
# 修改单级文件、文件夹名称

os.renames(old, new)
# os.renames("one/b.text", "two/bb.text")
# 修改多级文件、文件夹名称
删除文件
os.remove(path)
# 文件不存在会报错

删除目录
os.rmdir(path)
# 不能递归删除目录,os.rmdir(one/two), 只删除 two
# 如果文件夹非空,会报错

os.removedirs(path)
# 可以递归删除目录,os.rmdir(one/two), 删除one 和 one 内的 two
# 如果文件夹非空,会报错
os.mkdir("文件夹名"[, mode])
# 不能递归创建
# 只能创建第一级目录
# mode 指数字模式权限,默认 mode:int = 0o777
一般分为三组
* 文件拥有者
  - 读:r -> 4
  - 写:w -> 2
  - 可执行:x -> 1

* 同组用户
  - 读
  - 写
  - 可执行

* 其他用户
  - 读
  - 写
  - 可执行
os.getcwd()
os.chdir("目标目录")
os.listdir("./")
# 列举一级目录
# ./ 当前所在目录
# ../ 当前目录所在的上一级目录

3 参考案例

import os

os.chdir("files")

# 1. 只读模式, 打开要复制的文件
#   追加模式, 打开副本文件

# 编码格式一定要统一,所以会手动指定,如果不指定,默认就是 utf-8
source_file = open("d.txt", "r", encoding="utf-8") 
dst_file = open("d_bat.txt", "a", encoding="utf-8")



# 2. 从源文件中读取内容
#   写入到目标文件中

#content = source_file.read()
#dst_file.write(content)

# 优化读取
while True:
    content = source_file.read(1024)
    if len(content) == 0:
        break
    print("----", content)
    dst_file.write(content) # 因为读取操作,指针会自动移动到读取位置,所以内容是连续写入的


#3. 关闭源文件和目标文件
source_file.close()
dst_file.close()
步骤分析

1. 给定一批文件
a.avi、b.jpg、c.jpg、d.text、e.avi、f.text
2. 按照文件后缀名,划分到不同的文件里
* 文件夹命名:后缀名
* 结果:
avi - a.avi、e.avi
jpg - b.jpg、c.jpg
text - d.text、f.text

3. 生成 text 格式的文件清单

将在 files 文件夹下的文件按后缀名分类

 # 0, 获取所有的文件名称列表
 import os
 import shutil

 path = "files"

 if not os.path.exists(path):
     exit()

 os.chdir(path)
 file_list = os.listdir("./")
 # print(file_list)

 # 1. 遍历所有的文件(名称)
 for file_name in file_list:
     # print(file_name)
     # 2. 分解文件的后缀名
     # 2.1 获取最后一个.的索引位置 xx.oo.txt
     index = file_name.rfind(".")
     if index == -1:
         continue
     # print(index)
     # 2.2 根据这个索引位置, 当做起始位置, 来截取后续的所有字符串内容
     extension = file_name[index + 1:]
     print(extension)

     # 3. 查看一下, 是否存在同名的目录

     # 4. 如果不存在这样的目录 -> 直接创建一个这样名称的目录
     if not os.path.exists(extension):
         os.mkdir(extension)

     # 5, 目录存在 -> 移动过去
     shutil.move(file_name, extension)

按目录分类后,生成清单

import os

# file_list = os.listdir("files")
# print(file_list)

# 通过给定的文件夹, 列举出这个文件夹当中, 所有的文件,以及文件夹, 子文件夹当中的所有文件
def listFilesToTxt(dir, file):
    # 1. 列举出, 当前给定的文件夹, 下的所有子文件夹, 以及子文件
    file_list = os.listdir(dir)
    # print(file_list)
    # 2. 针对于, 列举的列表, 进行遍历
    for file_name in file_list:
        new_fileName = dir + "/" + file_name
        # 判定, 是否是目录, listFiles
        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("files", f)
上一篇 下一篇

猜你喜欢

热点阅读