python实时写入文件

Bor*_* Me 3 python file python-3.x

我有这段 python 代码,它通过文本文件 (urls.txt) 中的 url 列表循环,然后跟踪所有 url 的重定向,如果 url 包含特定字符串,则将其写入名为 redirects.txt 的文件

import urllib.request
import ssl
redf = open('redirect.txt', 'w')
with open('urls.txt') as f:
   for row in f:
    #try:

      context = ssl._create_unverified_context()
      finalurl = ''
      try:
        res      = urllib.request.urlopen(row, context=context, timeout=10)
        finalurl = res.geturl().strip()
      except:
          #remove from list
          print("error:"+finalurl)

      # filedata = file.read()
      if finalurl.strip():
        if "/admin/" in finalurl:
            redf.write(finalurl+"\n");
Run Code Online (Sandbox Code Playgroud)

问题是在创建redirect.txt 文件之前,我必须等待整个URS 处理完毕。

我怎样才能实时写作?

Sha*_*ger 5

文件已创建,但由于您的输出很小,很可能在文件关闭之前它都卡在写缓冲区中。如果您需要更迅速地填充文件,请通过以下方式以行缓冲模式buffering=1打开它:

open('redirect.txt', 'w', buffering=1)
Run Code Online (Sandbox Code Playgroud)

或flush在 each 之后write,通过显式调用flush:

redf.write(finalurl+"\n")
redf.flush()
Run Code Online (Sandbox Code Playgroud)

或者,由于您无论如何都要添加换行符,因此您也可以使用printwithflush=True让它为您工作:

print(finalurl, file=redf, flush=True)
Run Code Online (Sandbox Code Playgroud)

旁注:您真的想对打开的文件使用with语句,特别是,但您只将它用于正在读取的文件(它不太重要,因为最坏的情况只是延迟句柄关闭,而不是丢失的写入)。否则异常会导致文件被刷新/关闭的任意延迟。只需将两个打开合二为一with,例如:

with open('urls.txt') as f, open('redirect.txt', 'w', buffering=1) as redf:
Run Code Online (Sandbox Code Playgroud)