Python';继续';干扰';尝试/除了';或';与';?

Python';继续';干扰';尝试/除了';或';与';?,python,Python,我有一个老剧本在履行它的职责多年了,它突然失败了,我甚至不知道它怎么能达到失败的程度,因为我认为已经消除了这个案例: 它应该浏览一个文件列表(目录的内容),如果当前文件以.sum结尾,它应该检查是否有同名文件减去.sum结尾(如file1.txt.sum和file1.txt)。 如果两个文件都存在,它应该对file.txt`进行校验和,并将其与校验和文件的内容进行比较 仅当此检查成功时,将有进一步的操作以两个文件从目录中删除而结束 for file in filelist: checksum

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

它应该浏览一个文件列表(目录的内容),如果当前文件以
.sum
结尾,它应该检查是否有同名文件减去
.sum
结尾(如
file1.txt.sum
file1.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
结尾的文件不存在。这怎么会发生?
是否继续
在该上下文中执行其工作

编辑: 由于代码似乎没有逻辑上的错误,错误可能就在外面(尽管我不知道怎么可能)。因此,进一步的信息:文件的实际来源是通过SFTP(使用PySTFP)到达的目录。
filelist
filelist=sftp.listdir()
填充,在问题块开始之前,所有文件都被下载(到
SAVETO
)。它们应该在SFTP服务器上用
SFTP.remove(文件[:-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
回溯(最近一次呼叫最后一次):
文件“script.py”,第71行,在
删除(文件[:-4])
文件“/home/alba/.local/lib/python2.7/site packages/pysftp/_init__.py”,删除中的第728行
self.\u sftp.remove(远程文件)
文件“/home/alba/.local/lib/python2.7/site packages/paramiko/sftp_client.py”,第365行,删除
self.\u请求(CMD\u删除,路径)
文件“/home/alba/.local/lib/python2.7/site packages/paramiko/sftp_client.py”,第780行,在请求中
返回self.\u读取\u响应(num)
文件“/home/alba/.local/lib/python2.7/site packages/paramiko/sftp_client.py”,第832行,在_read_响应中
自我转换状态(msg)
文件“/home/alba/.local/lib/python2.7/site packages/paramiko/sftp_client.py”,第861行,处于转换状态
raise IOError(errno.enoint,text)
IOError:[Errno 2]没有这样的文件或目录
EDIT2:还是不能让这件事过去。我猜,如果在脚本下载文件后,该文件在服务器上被删除,脚本就会像这样失败,因为文件当然不再存在了。但从那时起,脚本每次都失败了。没有道理


EDIT3:答案已解决。感谢您的时间和耐心。

我在代码中搜索bug的第一种方法为该线程命名,结果证明它是错误的

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


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

你能用一致的缩进吗?最好按照脚本中的要求使用四个空格。在我的脚本中,我使用了两个空格,这里混合了,我将使用它们来创建文件路径并只捕获相关的异常。它现在不会解决您的问题,但将来可能会对您有所帮助。是否有可能有两个脚本实例正在运行?乍一看,这看起来像是一场竞赛。我认为,如果您需要更具体的帮助,您必须将脚本缩减到一些小的内容,以便我们可以运行并重现问题。否则,我们只能猜测。