今天做《python for information》中习题11.2
但是感觉按行读取不太爽,re.findall明明可以直接返回全部结果的列表的于是就想直接全文截取需要的数字。
测试结果正常。
Write a program to look for lines of the form
New Revision: 39772
And extract the number from each of the lines using a regular expression and the findall() method. Compute the average of the numbers and print out the average.
Enter file:mbox.txt
38549.7949721
Enter file:mbox-short.txt
39756.9259259
初步完成的结果是
import re
numlist = list()
#open the file
fhand = open('mbox-short.txt')
for line in fhand:
x = re.findall('^New Revision: ([0-9]+)',line)
if x != []:
num = int(x[0])
numlist.append(num)
print sum(numlist)/float(len(numlist))
但是感觉按行读取不太爽,re.findall明明可以直接返回全部结果的列表的于是就想直接全文截取需要的数字。
import re
numlist = list()
#open the file
fhand = open('mbox-short.txt')
for line in fhand:
x = re.findall('^New Revision: ([0-9]+)',line)
if x != []:
num = int(x[0])
numlist.append(num)
print sum(numlist)/float(len(numlist))
numlist = []
inp = fhand.read()
list = re.findall('.*New Revision: ([0-9]+)',inp)
for i in list:
numlist.append(int(i))
print sum(numlist)/float(len(numlist))
然而运行结果却出乎意料的没有获得需要的数字,print测试得到的是一个空列表。为什么这里就无法截取了呢?后来问了YF同学,他发现的应当在下面再打开一次文件fhand可能在上一个循环中被破坏了,可能像C中的指针。
import re
numlist = list()
#open the file
fhand = open('mbox-short.txt')
for line in fhand:
x = re.findall('^New Revision: ([0-9]+)',line)
if x != []:
num = int(x[0])
numlist.append(num)
print sum(numlist)/float(len(numlist))
numlist = []
fhand = open('mbox-short.txt')
inp = fhand.read()
list = re.findall('.*New Revision: ([0-9]+)',inp)
for i in list:
numlist.append(int(i))
print sum(numlist)/float(len(numlist))
测试结果正常。
但是为什么fhand会被破坏?他说像是指针,不过type(fhand)的得到的是“file”类型。莫非file类型想指针是指向一个文件的内存地址,随着文件的读取指针指向会改变于是一个循环下来fhand就被破坏了?不得而知。留待以后解答吧。