Чтение текстового файла с веб-страницы Python3
import re
import urllib
hand=urllib.request.urlopen("http://www.pythonlearn.com/code/mbox-short.txt")
qq=hand.read().decode('utf-8')
numlist=[]
for line in qq:
line.rstrip()
stuff=re.findall("^X-DSPAM-Confidence: ([0-9.]+)",line)
if len(stuff)!=1:
continue
num=float(stuff[0])
numlist.append(num)
print('Maximum:',max(numlist))
Переменная Содержит все строки из текстового файла. Однако цикл for
не работает и numlist
по-прежнему пуст.
Когда я загружаю текстовый файл в виде локального файла, а затем читаю его, все в порядке.
1 ответ:
Используйте регулярное выражение на qq, используя многострочный флаг
re.M
, вы перебираете строку, поэтому идете символ за символом , а не строка за строкой, поэтому вы вызываете findall на одиночных символах:In [18]: re.findall("^X-DSPAM-Confidence: ([0-9.]+)",qq, re.M) Out [18]: ['0.8475', '0.6178', '0.6961', '0.7565', '0.7626', '0.7556', '0.7002', '0.7615', '0.7601', '0.7605', '0.6959', '0.7606', '0.7559', '0.7605', '0.6932', '0.7558', '0.6526', '0.6948', '0.6528', '0.7002', '0.7554', '0.6956', '0.6959', '0.7556', '0.9846', '0.8509', '0.9907']
То, что вы делаете, эквивалентно:
In [13]: s = "foo\nbar" In [14]: for c in s: ....: stuff=re.findall("^X-DSPAM-Confidence: ([0-9.]+)",c) print(c) ....: f o o b a r
Если вы хотите поплавки, вы можете бросить с
map
:list(map(float,re.findall("^X-DSPAM-Confidence: ([0-9.]+)",qq, re.M)))
Но если вы просто хотите получить максимум, вы можете передать ключ в
max
:In [22]: max(re.findall("^X-DSPAM-Confidence: ([0-9.]+)",qq, re.M),key=float) Out[22]: '0.9907'
Итак, все, что вам нужно, это три строки:
In [28]: hand=urllib.request.urlopen("http://www.pythonlearn.com/code/mbox-short.txt") In [29]: qq = hand.read().decode('utf-8') In [30]: max(re.findall("^X-DSPAM-Confidence: ([0-9.]+)",qq, re.M),key=float) Out[30]: '0.9907'
Если вы хотел бы пройти строчку за строчкой, перебрать непосредственно
hand
:import re import urllib hand = urllib.request.urlopen("http://www.pythonlearn.com/code/mbox-short.txt") numlist = [] # iterate over each line like a file object for line in hand: stuff = re.search("^X-DSPAM-Confidence: ([0-9.]+)", line.decode("utf-8")) if stuff: numlist.append(float(stuff.group(1))) print('Maximum:', max(numlist))