【问题标题】:FileNotFoundError But The File Is There: Cryptography EditionFileNotFoundError 但文件在那里:密码学版
【发布时间】:2021-12-10 15:08:22
【问题描述】:

我正在编写一个将校验和和目录作为输入的脚本。 在没有太多背景的情况下,我正在可执行文件目录中寻找“恶意软件”(即标志)。我得到了“恶意软件”的 SHA512 总和。我已经让它工作了(我找到了标志),但是在为不同的加密协议、编码和单个文件而不是目录概括了函数后,我遇到了输出问题:

FileNotFoundError: [Errno 2] No such file or directory : 'lessecho'

目录中确实有一个文件lessecho,并且碰巧接近返回实际标志的文件。大概是巧合吧。大概吧。

下面是我的 Python 脚本:

#!/usr/bin/python3

import hashlib, sys, os


"""
### TO DO ###
Add other encryption techniques
Include file read functionality
"""

def main(to_check = sys.argv[1:]):
    dir_to_check = to_check[0]
    hash_to_check = to_check[1]
 
    BUF_SIZE = 65536

    for f in os.listdir(dir_to_check):
        sha256 = hashlib.sha256()
        with open(f, 'br') as f:        <--- line where the issue occurs
            while True:
                data = f.read(BUF_SIZE)
                if not data:
                    break
                sha256.update(data)
        f.close() 

        if sha256.hexdigest() == hash_to_check:
            return f


if __name__ == '__main__':
    k = main()
    print(k)

感谢 Randall 的回答 here

这里有一些来自我家乡的不起眼的小饰品,以换取你的智慧。

【问题讨论】:

  • 出现错误的行是什么?
  • 谢谢。刚刚更新了markdown。

标签: python-3.x file-not-found python-os


【解决方案1】:

您的listdir 调用为您提供了裸文件名(例如lessecho),但它位于dir_to_check 目录中(为方便起见,我将其称为foo)。要打开文件,您需要将路径的这两部分重新连接在一起,以获得正确的路径(例如foo/lessecho)。 os.path.join 函数正是这样做的:

for f in os.listdir(dir_to_check):
    sha256 = hashlib.sha256()
    with open(os.path.join(dir_to_check, f), 'br') as f:  # add os.path.join call here!
       ...

代码中还有一些其他问题,与您当前的错误无关。一种是您对文件名(来自循环)和文件对象(在with 语句中)使用相同的变量名f。为其中一个选择不同的名称,因为您需要两者都可用(因为我假设您打算 return f 返回文件名,而不是最近关闭的文件对象)。

说到关闭的文件,你实际上是关闭了文件对象两次。第一个发生在with 语句的末尾(这就是为什么你使用with)。第二个是您手动拨打f.close()。您根本不需要手动调用。

【讨论】:

  • 太棒了,感谢您的澄清!
猜你喜欢
  • 2020-02-03
  • 2017-09-13
  • 1970-01-01
  • 2016-11-12
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多