2016-01-31 2 views
3
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)) 

Переменная qq содержит все строки из текстового файла. Однако цикл for не работает, и numlist по-прежнему пуст.Чтение текстового файла с веб-страницы Python3

Когда я загружаю текстовый файл в виде локального файла, тогда прочитайте его, все в порядке.

+1

Что вы пытаетесь сделать? Просьба уточнить. – AMACB

+0

В текстовом файле есть плавающее число для каждой строки, которая начинается со строки «X-DSPAM-Confidence:». например X-DSPAM-Уверенность: 60.69. Я собираюсь выбрать самый большой из этих чисел. –

ответ

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'] 

Что вы делаете equivalnet на:

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)) 
+1

Спасибо. Вы ясно объяснили это, и я многому научился. –

+0

Не беспокойтесь, пожалуйста. –

Смежные вопросы