重新打开文件以进行追加

时间:2016-01-26 18:18:56

标签: python python-2.7

我不了解文件输出。我想打开一个文件,写入它,关闭它,然后重新打开它,追加,关闭。

我不想在脚本运行的整个过程中保持文件打开。

我在文件中看到的只有 * Start * 。我希望看到失败消息和完整消息。 我该怎么做?

log_failed_download_file = open(log_failed_download_filename, "w")
log_failed_download_file.write ("\n*** Start ***");
log_failed_download_file.close()

# other logic (os.chdir)

for x in range(start_x, end_x + 1): 
    # do stuff, possibly set download_error to False
    if (download_error == False):
        log_failed_download_file = open(log_failed_download_filename, "a")
        log_failed_download_file .write(url)
        log_failed_download_file .close()

# other logic

log_failed_download_file = open(log_failed_download_filename, "a")
log_failed_download_file.write ("\n\nComplete - %r" % str(datetime.datetime.now().strftime('%m/%d/%Y  %H:%M:%S')))
log_failed_download_file.close()

编辑: 我已经补充说os.chdir在"其他逻辑"因为这是问题的根源。

3 个答案:

答案 0 :(得分:3)

如果log_failed_download_filename只是文件名,则更改当前工作目录将改变您写入的位置。因此,您将一半的日志写入一个地方,然后在您致电os.chdir后将其余内容写入另一个地方。

为避免这种情况,您可以将文件名设置为整个文件路径:

log_path = os.path.abspath(log_failed_download_filename)

这给出了文件的绝对路径。来自os.path.abspath的文档:

  

返回路径名路径的规范化绝对化版本。在大多数平台上,这相当于调用函数normpath(),如下所示:normpath(join(os.getcwd(), path))

致电os.chdir后,os.getcwd可能会返回不同的内容,因此abspath也会有所不同。

请注意,现代Python使用with上下文管理器打开文件。这会自动为您关闭文件:

with open(log_path, 'w') as log:
    log.write("\n*** Start ***")

# other logic (os.chdir)

for x in range(start_x, end_x + 1): 
    # do stuff, possibly set download_error to False
    if not download_error:
        with open(log_path, 'a') as log:
            log.write(url)

# other logic

with open(log_path, 'a') as log:
    log.write("\n\nComplete - %r" %
               str(datetime.datetime.now().strftime('%m/%d/%Y  %H:%M:%S')))

答案 1 :(得分:0)

据我所知,python函数写一个文件,创建一个新文件写入它。因此,每次使用.write函数时,它都会创建一个文件并写入您在参数上放置的任何内容,如果使用现有文件并写入,则会删除其初始内容并写入其他信息。

在你的情况下,程序会经历第一个写入语句,并且永远不会到达下一个语句,因为从逻辑上讲,如果你的程序是完美的,它会在你的目录中创建多个文件。

答案 2 :(得分:0)

您可能希望使用下面的log函数:

def main():
    a = 1
    log('my_log.txt', 'Hello', 'World')
    a += 1
    log('my_log.txt', 'a =', a)


def log(path, *objects):
    with open(path, 'at') as file:
        print(*objects, file=file)

if __name__ == '__main__':
    main()