目录
题目描述
随机生成一个txt文件。要求文件的行数随机1 -- 100行。每一行随机1 -- 100个字符。字符随机从数字和大小写字母中选取。
输入一个字符,计算该字符在随机生成的txt文件中出现的次数。如果输入的是字母,不区分大小写,来计算其出现的次数。
条件限制:从txt文件中读取内容时,为了避免占用过多的内存,要求限制在100字节/次的读取速度。
输入/输出描述
输入:想要检测的字符(只能是数字或英文大小写字母)
输出:该字符在随机文件中和出现的次数。(不区分大小写)
解题思路
1、预置输出文件或清空文件
2、生成随机字符并写入文件
3、计算次数
代码
import string
import random
def rollback(url):
open(url, "w").write("")
return
def read_file(url, ele, size=100):
count = 0
with open(url, "r") as f:
while True:
line = f.read(size)
if not line:
break
count += process(line, ele)
f.close()
return count
def process(line, ele):
lower = line.lower()
return lower.count(ele.lower())
pools = string.digits + string.ascii_letters
path = "example.txt"
logo = input("Please input a char to count numbers in file: ")
if len(logo) > 1:
logo = logo[0]
if logo not in pools:
print("Invalid Char input.")
exit()
# 预置输出文件或清空文件
rollback(path)
# 按要求生成随机内容并写入文件
lines_num = random.randint(1, 100)
for i in range(lines_num):
char_num = random.randint(1, 100)
write_str = ""
for j in range(char_num):
rs = random.choice(pools)
write_str += rs
write_str += "\n"
open(path, "a").write(write_str)
print("count char %s: %s" % (logo, read_file(path, logo)))
代码走读
import string
import random
# 资源预置。创建或清空txt文件
def rollback(url):
open(url, "w").write("")
return
# 读文件,读取速度限制在100字节/次,返回计算出字符出现的次数的结果
def read_file(url, ele, size=100):
count = 0
with open(url, "r") as f:
while True:
line = f.read(size)
if not line:
break
count += process(line, ele)
f.close()
return count
# 真正计算次数的函数,将读取到的字符片段转化为小写(因为要求不区分大小写),在统一进行计算
def process(line, ele):
lower = line.lower()
return lower.count(ele.lower())
# 代码开始的位置。pools表示随机字符池,包含数字字符0-9和大小写字母。
pools = string.digits + string.ascii_letters
# txt文件的路径
path = "example.txt"
# 输入待检测次数的字符。如果输入多个字符,则只检测第一个输入的字符。如果第一个输入的字符不在pools中,则报错并终止程序
logo = input("Please input a char to count numbers in file: ")
if len(logo) > 1:
logo = logo[0]
if logo not in pools:
print("Invalid Char input.")
exit()
# 调用自定义的rollback()函数预置输出文件或清空文件
rollback(path)
# 按要求生成随机内容并写入文件
# lines_num随机行数。char_num每一行的随机字符数
lines_num = random.randint(1, 100)
for i in range(lines_num):
char_num = random.randint(1, 100)
write_str = ""
for j in range(char_num):
rs = random.choice(pools)
write_s