我有一个古老的脚本,已经履行了多年的职责,但突然失败了,而且我不知道它怎么能达到失败的地步,因为我想消除这种情况:
它应该遍历文件列表(目录的内容),并且如果当前文件以.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
结尾的文件。怎么会这样continue
不在这种情况下工作吗?
编辑:
由于似乎在逻辑上代码没有错,所以错误可能是外部的(尽管我不知道怎么可能)。因此,更多信息:文件的实际来源是通过SFTP(使用pysftp)到达的目录。 filelist
用filelist = 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:已解决。谢谢您的时间和耐心。
答案 0 :(得分:0)
我在代码中搜索错误的第一种方法给该线程加了标题,事实证明这是错误的。
该错误发生在输入目录中输入了过去已经输入过的校验和文件,然后又正确地输入对应的数据文件,但现在没有对应的数据文件时: (再次)下载的校验和文件将得到评估,脚本将查找对应的数据文件,该文件仍然存在于过去的工作目录中。它运行其操作,最后尝试从输入目录中删除校验和和数据文件,该操作对于数据文件失败。
不可预见,未处理的案件;超出最初的规格,但仍然令人尴尬。我从中了解到,可以更实际地对调试方法列表进行排序。