Python“继续”干扰“ try / except”或“ with”?

时间:2018-07-06 13:24:06

标签: python

我有一个古老的脚本,已经履行了多年的职责,但突然失败了,而且我不知道它怎么能达到失败的地步,因为我想消除这种情况:

它应该遍历文件列表(目录的内容),并且如果当前文件以.sum结尾,则它应该检查是否存在一个同名文件,减去.sum结尾(例如file1.txt.sumfile1.txt)。 如果两个文件都存在,则应对file.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.remove(file[:-4])在SFTP服务器上将其删除,这是脚本无法抛出

的地方
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:已解决。谢谢您的时间和耐心。

1 个答案:

答案 0 :(得分:0)

我在代码中搜索错误的第一种方法给该线程加了标题,事实证明这是错误的。

该错误发生在输入目录中输入了过去已经输入过的校验和文件,然后又正确地输入对应的数据文件,但现在没有对应的数据文件时: (再次)下载的校验和文件将得到评估,脚本将查找对应的数据文件,该文件仍然存在于过去的工作目录中。它运行其操作,最后尝试从输入目录中删除校验和和数据文件,该操作对于数据文件失败。

不可预见,未处理的案件;超出最初的规格,但仍然令人尴尬。我从中了解到,可以更实际地对调试方法列表进行排序。