test3 中读取文件的问题

test3 中读取文件的问题

老师,想问一下,课程中test3.py在后续优化的时候,如图https://img1.sycdn.imooc.com//climg/646ef63c093b4c5808560225.jpg

https://img1.sycdn.imooc.com//climg/646ef9de09436a0708310159.jpg

这两个地方的if判断是否没必要了,使用rb打开文件的话应该不管文件是txt还是zip,都是以二进制格式打开的嘛,f.read()返回的数据也都是二进制的,而且即使文件中有中文应该也不影响吧,这样理解对不对?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小猿 2023-05-25 14:51:18

同学,你好!1、需要的,第一个if 语句中如果有zip 说明是压缩文件,用rb 读取,不需要写编码。如果不是zip 文件执行else语句,例如是个.txt文件,文件名有中文,读取文件内容时需要指定读取编码。不然会报错的。

https://img1.sycdn.imooc.com//climg/646f052a092ef16514350470.jpg

2、haslib.md5()参数类型需要是bytes类型。如果是bytes类型就不需要将数据再转byte类型了,若不是byte类型,则需要执行else语句将数据转为bytes类型后,再使用hashlid.md5函数

祝学习愉快~

  • # coding:utf-8
    import os
    import hashlib
    
    from glob import glob
    
    # 获取当前路径下所有内容
    # 判断每个内容的类型(文件夹还是文件)
    # 递归
    
    data = {}
    
    
    def clear(path):
        result = glob(path)
    
        for _data in result:
            if os.path.isdir(_data):
                if 'venv' in _data:
                    continue
                _path = os.path.join(_data, '*')
                clear(_path)
            else:
                name = os.path.split(_data)[-1]
    
                f = open(_data, 'rb')
                content = f.read()
                f.close()
    
                hash_content_obj = hashlib.md5(content)
                hash_content = hash_content_obj.hexdigest()
    
                if name in data:
                    sub_date = data[name]
                    is_delete = False
    
                    for k, v in sub_date.items():
                        if hash_content == v:
                            os.remove(_data)
                            print('%s 文件已删除' % _data)
                            is_delete = True
    
                    if not is_delete:
                        data[name][_data] = hash_content
    
                else:
                    data[name] = {
                        _data: hash_content
                    }
    
    
    if __name__ == '__main__':
        n_path = os.path.join(os.getcwd(), '*')
        clear(n_path)
        for k1, v1 in data.items():
            for _k, _v in v1.items():
                print(_k, _v)

    但我试过直接这样写的话也没问题啊,文件中有中文也没报错

    2023-05-26 08:35:13
  • 同学,你好!同学的方法都用rb方式读取文件也是可以实现删除重复文件的。

    祝学习愉快~

    2023-05-26 10:48:29
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师