我有这段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被处理。
我如何实时写作?
答案 0 :(得分: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:
答案 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
函数中重试。