① 复习文件的访问模式
以前 还讲过 with……as 返回的东西
它可以使 返回的东西 在 with……as 语句外 不生效。即 它只在 自己 的 作用域内生效。也就相当于 自动销毁。周期比较短。所以 文件操作 我们可以 用 with……as 这样我们就不需要 关闭文件了。
② pandas 也可以读 记事本文件
pandas.read_csv('文件的路径') 其文件以纯文本形式存储表格数据,我们会把它分行的读取出来,并带有 索引编号。
csv数据对象.to_csv('存储路径',index=False) index=False 就是不带 编号 写入文件,进行存储。
import pandas as pd with open("1.txt","w",encoding='utf-8') as f: f.write('第一行\n第二行\n第三行') csv = pd.read_csv('1.txt') print(csv) csv.to_csv('2.txt',index=False) csv.to_csv('3.txt')
③ 临时文件的概念和 临时文件模块 <建议爬虫时使用>
Python 的文件读写,是 自适应临时文件的!!!当 你在大量数据上 进行部分读写操作时,就会创建临时文件。而临时文件不会造成 缓冲区的堵塞,还可以提高 效率。
所以 我们总是会看到,当涉及到 文件读写的时候,都是 分着 多少个字节,每 多少个字节,一步一步的读写的。基本上没有 一下子 写入。。一下子读取 这种情况~ ~ 除非是新手。。
除此之外,我们也可以 手动的来创建 临时文件和临时文件夹。
TemporaryFile('访问模式') 创建一个临时的文件,并对其进行相应操作
TemporaryDirectory() 创建一个临时文件夹
from tempfile import TemporaryFile from tempfile import TemporaryDirectory with TemporaryDirectory() as 临时文件夹: print(f"临时文件夹路径:{临时文件夹}") with TemporaryFile('w') as 临时文件: print(f"临时文件路径:{临时文件.name}") print(f"临时文件对象:{临时文件}")
① ZipFile('zip文件路径','访问模式')
zip对象.namelist() 读取zip 压缩包里 各个文件的名字,它会返回一个列表。
import zipfile with zipfile.ZipFile('1.zip') as zip: for 文件名 in zip.namelist(): print(文件名)
中文 出现乱码,是很正常的。因为 zipfile 对文件名 进行了 CP437 编码,所以我们要 先将其 进行 CP437 编码,然后 因为编码的是中文。所以 再进行 gbk 解码即可。
② 查看 每个文件的信息 <file_size 压缩前大小,compress_size 压缩后大小>
zip对象.getinfo(文件名) 从压缩包里 获取 相关文件的信息
import zipfile with zipfile.ZipFile('1.zip') as zip: for 文件名 in zip.namelist(): print(文件名.encode('cp437').decode('gbk')) 信息 = zip.getinfo(文件名) print(信息) print(信息.file_size,信息.compress_size)
③ 解压缩 <在读取模式下,我们可以进行 解压缩>
zip.extract(文件名,存储的路径位置) 把单个文件进行解压缩 到 指定位置
zip.extractall('存储的路径位置') 把所有的文件进行解压缩 到 指定位置
import zipfile import os from pathlib import Path if not os.path.isdir('文件夹'): os.mkdir('文件夹') with zipfile.ZipFile('1.zip') as zip: for 文件名 in zip.namelist(): 信息 = zip.getinfo(文件名) 解压后的文件 = Path(zip.extract(文件名,'文件夹')) print(解压后的文件.name) 解压后的文件.rename('文件夹\\'+文件名.encode('cp437').decode('gbk'))
解压的时候,我们也要注意,如果有 中文的话,我们就要 进行 乱码的重命名 操作了。这个 你可以用 pathlib 模块,也可以 直接 os.rename() 个人 推荐 直接用 os.rename()
④ 单个文件和单个文件夹 进行压缩到指定压缩包。
import os import zipfile import os # 压缩单个文件 zip = zipfile.ZipFile('单个文件.zip','w',zipfile.ZIP_DEFLATED) zip.write('1.txt') # 压缩单个文件夹 zip = zipfile.ZipFile('单个文件夹.zip','w',zipfile.ZIP_DEFLATED) for path,dirnames,filenames in os.walk('文件夹'): for dirname in dirnames: zip.write(os.path.join(path, dirname)) for filename in filenames: zip.write(os.path.join(path,filename))
比如说 我们 这里有三个 重复的 文件,并不是 单纯的 文件名重复。而是数据本身 是一样的!这样的重复 我们只能够用 hash 值 来进行判断。
头像 = open('头像.jpg',"rb").read() 头像1 = open('头像1.jpg',"rb").read() 头像2 = open('头像2.jpg',"rb").read() print(hash(头像)) print(hash(头像1)) print(hash(头像2))
依赖于 列表存储 第一个遇到的,列表里没有的 hash 值,我们就可以进行 留1 删 重 !
import os 头像 = open('图片文件/头像.jpg', "rb").read() 头像1 = open('图片文件/头像1.jpg', "rb").read() 头像2 = open('图片文件/头像2.jpg', "rb").read() 列表 = [] for path,dirnames,filenames in os.walk('图片文件'): for filename in filenames: if os.path.isfile(os.path.join(path,filename)): f = open(os.path.join(path,filename),'rb').read() hashCode = hash(f) try: 列表.index(hashCode) except Exception as e: 列表.append(hashCode) else: os.remove(os.path.join(path,filename))