【问题标题】:python write to file in real timepython实时写入文件
【发布时间】:2019-06-05 15:31:51
【问题描述】:

我有这段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");

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

如何实时写作?

【问题讨论】:

  • 我只是在这里猜测,但可能没有有效的方法来做到这一点。我之所以这么说,是因为在任何操作系统中,文件必须是 closed 或保存后才能读取更改。

标签: python python-3.x file


【解决方案1】:

文件已创建,但由于您的输出很小,很可能在文件关闭之前它都卡在写缓冲区中。如果您需要更快地填写文件,请在line buffered mode by passing buffering=1 中打开它:

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

flush 在每个write 之后,或者explicitly 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:

【讨论】:

    【解决方案2】:

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

    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 函数中重试。

    【讨论】:

    • 反复打开、写入和关闭文件是一个相当高的开销操作;我不鼓励这种方法,除非写入发生不可预测(例如,在复杂应用程序的许多部分中由用户输入等驱动)。当所有写入都发生在定义的时间范围内时,不要经常打开和关闭文件。
    • ? 我同意:你的缓冲/刷新机制看起来更合适。
    猜你喜欢
    • 2021-09-17
    • 2017-08-18
    • 1970-01-01
    • 2012-12-07
    • 2011-03-08
    • 2022-11-04
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多