python实时写入文件

时间:2019-01-10 17:41:38

标签: python python-3.x file

我有这段python代码,它循环遍历文本文件中的url列表(urls.txt),然后跟随所有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");

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

我如何实时写作?

2 个答案:

答案 0 :(得分:1)

文件已创建,但是由于您的输出很小,因此很有可能所有文件都停留在写缓冲区中,直到关闭文件为止。如果您需要更迅速地填写文件,请在line buffered mode by passing buffering=1中打开它:

open('redirect.txt', 'w', buffering=1)

flush之后的writeexplicitly calling flush之前:

redf.write(finalurl+"\n")
redf.flush()

或者,由于您还是要添加换行符,因此最好使用print with flush=True

print(finalurl, file=redf, flush=True)

旁注:您真的想将with statements与打开的特定文件一起使用,但是您只将其用于正在读取的文件(不那么重要,因为最坏的情况就是延迟关闭句柄,而不是丢失写操作)。否则,异常可能导致刷新/关闭文件中的任意延迟。只需将两个打开组合成一个with,例如:

with open('urls.txt') as f, open('redirect.txt', 'w', buffering=1) as redf:

答案 1 :(得分:0)

您可以追加到重定向文件,而不是在程序运行期间保持打开状态。

import urllib.request
import ssl

def append(line):
    with open('redirect.txt', 'a') as redf:
        redf.write(line)

with open('urls.txt') as f:
   for row in f:

      ...

      if finalurl.strip():
        if "/admin/" in finalurl:
            append(finalurl)

在处理文件时,取决于与文件的任何其他交互,您可能需要添加try/except机制以在append函数中重试。