Python“continue”干扰“try/except”或“with”?

2024-06-17 04:13:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个老剧本已经履行了多年的职责,但突然失败了,我甚至不知道它怎么能达到失败的程度,因为我想把这个案子消除掉:

它应该遍历一个文件列表(目录的内容),如果当前文件以.sum结尾,它应该检查是否有一个同名文件减去了.sum结尾(如file1.txt.sumfile1.txt)。 如果两个文件都存在,那么它应该对文件.txt`并将其与校验和文件的内容进行比较。你知道吗

仅当此检查成功时,将有进一步的操作以从目录中删除这两个文件而结束。你知道吗

for file in filelist:
  checksum_downloaded_file, checksum_from_checksumfile = '0', '1'
  if file.endswith('.sum'):
    # read checksum from checksum file
    f_sum = open(SAVETO + file, 'rb')
    with f_sum:
      checksum_from_checksumfile = f_sum.readline().split(' ')[0].rstrip().lower()
    # checksum() the file
    try:
      f = open(SAVETO + file[:-4], 'rb')
    except:
      continue
    with f:
      checksum_downloaded_file = hashlib.sha256(f.read()).hexdigest()

    # compare delivered checksum with selfmade
    if checksum_downloaded_file == checksum_from_checksumfile:
      [...]
      sftp.remove(file)
      sftp.remove(file[:-4])

我认为检查一个文件是否以与校验和文件相同的名称退出,除了.sum结尾之外,将由

    try:
      f = open(SAVETO + file[:-4], 'rb')
    except:
      continue

阻止。但是今天脚本在试图删除脚本末尾的两个文件时失败了,因为没有.sum结尾的文件不存在。怎么会这样?在这种情况下,continue不就是它的工作吗?你知道吗

编辑: 既然代码在逻辑上似乎没有什么问题,那么错误可能就在外面(尽管我不知道怎么可能)。因此,进一步的信息:文件的实际来源是通过SFTP(使用pysftp)访问的目录。filelistfilelist = sftp.listdir()填充,所有文件都在问题块开始之前下载到SAVETO。它们应该在SFTP服务器上用sftp.remove(file[:-4])删除,这就是脚本失败的地方

Traceback (most recent call last):
  File "script.py", line 71, in <module>
    sftp.remove(file[:-4])
  File "/home/alba/.local/lib/python2.7/site-packages/pysftp/__init__.py", line 728, in remove
    self._sftp.remove(remotefile)
  File "/home/alba/.local/lib/python2.7/site-packages/paramiko/sftp_client.py", line 365, in remove
    self._request(CMD_REMOVE, path)
  File "/home/alba/.local/lib/python2.7/site-packages/paramiko/sftp_client.py", line 780, in _request
    return self._read_response(num)
  File "/home/alba/.local/lib/python2.7/site-packages/paramiko/sftp_client.py", line 832, in _read_response
    self._convert_status(msg)
  File "/home/alba/.local/lib/python2.7/site-packages/paramiko/sftp_client.py", line 861, in _convert_status
    raise IOError(errno.ENOENT, text)
IOError: [Errno 2] No such file or directory

EDIT2:还是不能让这件事过去。我猜,如果在脚本下载文件后,文件在服务器上被删除,脚本就会像这样失败,因为文件当然不再存在了。但从那时起,剧本每次都失败了。没道理。。你知道吗

EDIT3:答案已解决。谢谢你的时间和耐心。你知道吗


Tags: 文件inpy脚本homeliblocalline
1条回答
网友
1楼 · 发布于 2024-06-17 04:13:28

我在代码中搜索bug的第一种方法给出了这个线程的标题,结果证明是错误的。你知道吗

当输入目录被输入一个校验和文件时,就会发生错误,这个校验和文件在过去已经被输入过了,然后正确地返回到相应的数据文件,但是现在没有相应的数据文件: (再次)下载的校验和文件得到评估,脚本寻找一个对应的数据文件,它仍然存在于过去的工作目录中。它运行自己的操作,最后尝试从输入目录中删除校验和和数据文件,但数据文件失败。你知道吗

未预料到的,未处理的情况;超出最初的规格,但仍然令人尴尬。从中我学到了如何更实际地对调试方法列表进行排序。你知道吗

相关问题 更多 >