Python - 写入格式化字符串时出现IOError
我在使用我的 logger
函数时遇到了一个异常。我不明白为什么它会尝试 打开 我的日志内容。
这是我的代码,它抛出了 IOError
异常:
try:
logger(paths['log'], "Renamed %s in %s." % (song.getPath(), song.getTag('title')))
except IOError as err:
logger(paths['log'], "IOError: %s" % err)
这是我的 logger
函数:
def logger(log_path, log_content):
"""
:param log_path: where the log is going to be written
:param log_content: what to write
"""
log = open(log_path + "/" + "pynderella.log", 'a')
log.write("%s: %s\n" % (time.strftime("%d-%m-%y %H:%M:%S"), log_content))
log.close()
异常输出 (不存在的文件是 "log_content" 参数的一部分 [在这个例子中是 song.getPath()!]):
IOError: [Errno 2] No such file or directory: 'path/to/a/file/file.ext'
注意,异常已经被正确记录!
编辑:
getPath():
def getPath(self):
return self.path
Song 类的 init():
def __init__(self, path):
"""
:param path: the path of the song
"""
self.path = os.path.abspath(path)
getTag():
def getTag(self, tag):
"""
Returns a tag from the song.
:param tag: which tag wants to be retrieved
"""
track = None
if getExtension(self.path) in ['.mp3', '.mpeg3']:
track = EasyID3(self.path)
elif getExtension(self.path) == '.mp4':
track = EasyMP4(self.path)
try:
if tag.lower() in ['title', 'artist', 'album']:
return track[tag][0].encode('ascii', 'ignore') # it was encoded in unicode
except Exception as err:
logger(paths['log'], "Exception getTag: %s" % err)
return None
编辑 2: 这是我的日志文件输出:
21-03-14 16:27:16: Moved /Users/user/pynderella/daemon/source/boh.mp3 in destination/Paramore/All We Know Is Falling.
21-03-14 16:27:16: IOError: [Errno 2] No such file or directory: 'destination/Paramore/All We Know Is Falling/boh.mp3'
1 个回答
1
如果这是你记录日志的函数的全部代码,看起来你没有关闭文件。这样的话,文件的操作句柄就一直在忙着,导致你无法再打开它来添加新的日志。
即使这不是问题的根源,建议你在记录日志的函数中使用“try with resources”(或者“try-finally”)来确保在使用完文件后能够释放它的操作句柄。