Python - 写入格式化字符串时出现IOError

0 投票
1 回答
907 浏览
提问于 2025-04-17 23:18

我在使用我的 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”)来确保在使用完文件后能够释放它的操作句柄。

撰写回答