3.1 文件和文件夹篇
① 复习文件的访问模式
以前 还讲过 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"临时文件对象:{临时文件}")
3.2.1 Python 解压 ZIP 文件 [zipfile 模块]
① 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))
3.3.1 根据文件 hash 值,判断重复 即 删除
比如说 我们 这里有三个 重复的 文件,并不是 单纯的 文件名重复。而是数据本身 是一样的!这样的重复 我们只能够用 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))