ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python 文件和文件夹篇 03

2022-01-06 18:32:45  阅读:203  来源: 互联网

标签:03 zip 文件 Python zipfile 文件夹 path os


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))

在这里插入图片描述

标签:03,zip,文件,Python,zipfile,文件夹,path,os
来源: https://blog.csdn.net/qq_52606908/article/details/122346243

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有