Python课程作业三——文件读取时间

本文最后更新于:几秒前

题目要求

下载 参考资料–》课上代码–〉make_sentence.py,该文件的功能是可以生成一个句子,把该文件作为一个模块引入到你的程序中。

程序功能如下:

1、调用make_sentence.py模块,把生成的句子写到一个文本文件中,写100000000次,得到大约2G的一个文件

2、分别通过以下三种方式访问生成的文件,要求从文件中统计cat出现的次数。

1)磁盘文件检索方式

2)按行读取文件,一行一行读入内存处理

3)一次性读入内存处理

3、对上面的三种形式通过装饰器计算每种方式的运行时间。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
	import makesentence as ms
import time

def generate():
return " ".join(ms.sentence())
#装饰器
def timer(func):
# 传入了参数
def count_time(*args):
print("文件开始读取,计时开始")
start = time.time()
# 调用原函数
func(*args)
end = time.time()
print("文件结束读取,计时结束")
print("函数 {name} 的用时为 {time:.6f} 秒(s)".format(name = func.__name__,time = end-start))
return count_time

#以1e8次生成句子
def get_sentences(name):
file = open(name,'w')
for i in range(0,int(1e8)):
print(i)
file.write(generate()+'\n')
file.close()
#生成样例
def generate_samples(num,name,tmp_name):
new_file = open(tmp_name,'w')
file = open(name,'r')
time = 0
# 从源文件中读取样例
for line in file:
if time<num :
new_file.write(line)
time+=1
else :break
new_file.close()
file.close()

@timer
def count_cat_os(name):
cat = 0
try:
file = open(name,'r')
# 直接从file中检索,磁盘文件检索方法
for line in file:
words = line.split(" ")
for word in words:
if "cat" in word:cat+=1
file.close()
print("文件中共有:\t", cat, "个cat")
# 对FileNotFoundError单独处理
except FileNotFoundError:
print("文件名错误,请重新输入")
except:
print("出现异常,请重试")

@timer
def count_cat_line(name):
cat = 0
try:
file = open(name,'r')
while True:
# 读取每行
line = file.readline()
if not line: break
words = line.split(" ")
for word in words:
if "cat" in word: cat += 1
file.close()
print("文件中共有:\t", cat, "个cat")
except FileNotFoundError:
print("文件名错误,请重新输入")
except:
print("出现异常,请重试")

# @timer
# def count_cat_3(name):
# cat = 0
# try:
# file = open(name,'r')
# chars = file.read()
# words = chars.split()
# for each in words:
# if "cat" in each: cat += 1
# file.close()
# print("文件中共有:\t", cat, "个cat")
# except FileNotFoundError:
# print("文件名错误,请重新输入")

# 按字符处理
@timer
def count_cat_mem(name):
cat = 0
try:
file = open(name,'r')
# 一次性读到内存中
chars = file.read()
word = ""
for each in chars:
if each == ' ' or each == '\n':
if "cat" in word: cat += 1
word = ""
else :word += each
file.close()
print("文件中共有:\t", cat, "个cat")
except FileNotFoundError:
print("文件名错误,请重新输入")
# 由于需要一次性读到内存,对内存有要求,因此设置MemoryError处理
except MemoryError:
print("内存溢出!请选择其他方法或扩大文件存储")
except:
print("出现异常,请重试")

if __name__ == "__main__":
# 生成句子
# get_sentences("sentences.txt")
# 生成sample用来测试
# generate_samples(10000,"sentences.txt","s.txt")
count_cat_os("sentences.txt")
count_cat_line("sentences.txt")
count_cat_mem("sentences.txt")

'''
文件开始读取,计时开始
文件中共有: 48485821 个cat
文件结束读取,计时结束
函数 count_cat_1 的用时为 68.235201 秒(s)
文件开始读取,计时开始
文件中共有: 48485821 个cat
文件结束读取,计时结束
函数 count_cat_2 的用时为 80.687801 秒(s)
文件开始读取,计时开始
文件中共有: 48485821 个cat
文件结束读取,计时结束
函数 count_cat_3 的用时为 229.200805 秒(s)
'''

附:makesentence.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#### 生成复合英文语法的单词序列

from random import choice, seed, randrange

articles = ("a", "the","1","2","3","4","5","6","7","8","9","10")
nouns = ("cat", "dog", "sheep", "rabbit", "tiger", "chicken",
"fish", "grass", "seed", "carrot", "apple")
verbs = ("eats", "catches", "finds")

def sentence():
return noun_phrase() + verb_phrase()

def noun_phrase():
return [choice(articles), choice(nouns)]

def verb_phrase():
vp = [choice(verbs)]
if randrange(3) > 0:
vp.extend(noun_phrase())
return vp

if __name__ == "__main__":
seed()
for i in range(10):
print(" ".join(sentence()))


Python课程作业三——文件读取时间
http://paopao0226.site/post/e87a5ae2.html
作者
Ywj226
发布于
2022年10月25日
更新于
2023年9月23日
许可协议