Python запись в файл в режиме реального времени - PullRequest
0 голосов
/ 10 января 2019

У меня есть этот кусок кода Python, который проходит по списку URL-адресов в текстовом файле (urls.txt), затем следует перенаправления всех URL-адресов и, если URL-адрес содержит определенную строку, он записывает его в файл с именем перенаправления .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");

Проблема в том, что мне нужно дождаться обработки всего URS, прежде чем будет создан файл redirect.txt.

Как я могу писать в режиме реального времени?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Файл создан, но так как ваш вывод мал, вероятно, что он все застрял в буфере записи, пока файл не будет закрыт. Если вам нужно, чтобы файл был заполнен более быстро, либо откройте его в режиме буферизации строки, передав buffering=1:

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

или flush после каждого write, либо , явно вызывая flush:

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

или, так как вы все равно добавляете новые строки, так что вы также можете позволить ему работать для вас, используя print с flush=True:

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

Примечание: Вы действительно хотите использовать with операторов с файлами, открытыми для записи, в частности, но вы использовали его только для читаемого файла (где он меньше критический, поскольку в худшем случае это просто задержка дескриптора закрытия, а не потерянных записей). В противном случае исключения могут привести к произвольной задержке в файле, который сбрасывается / закрывается. Просто объедините два открытия в один with, например ::1010 *

with open('urls.txt') as f, open('redirect.txt', 'w', buffering=1) as redf:
0 голосов
/ 11 января 2019

Вы можете добавить файл перенаправления, вместо того, чтобы держать его открытым в течение всей вашей программы.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...