我不了解文件输出。我想打开一个文件,写入它,关闭它,然后重新打开它,追加,关闭。
我不想在脚本运行的整个过程中保持文件打开。
我在文件中看到的只有 * 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
在"其他逻辑"因为这是问题的根源。
答案 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()