习题1:
读一个文件,包含英文句子,请统计共多少个不重复并且在另外一个文件中打印每个单词及它出现的次数。
第一步:读文件
方法1:open
方法2:with
难点:怎么把英文句子中的所有标点去掉。
数字也要替换掉。
import string
with open("f:\\a.txt","r") as fp:
content = ""
for line in fp:
s = line
for i in string.punctuation:
s = s.replace(i," ")
content += s
print(content)
word_list = content.split()
print(word_list)
print("一共%s个不重复的单词:" %len(set(word_list)))
word_count = {}
for i in word_list:
if i in word_count:
word_count[i]+=1
else:
word_count[i]=1
print(word_count)
with open("f:\\b.txt","w") as fp:
fp.write("一共%s个不重复的单词:" %len(set(word_list)))
for key,value in word_count.items():
fp.write("%s单词出现了%s次" %(key,str(value))+"\n")
习题2:
写个记账程序,每天收入多少,支出多少,总额剩多少,使用序列化方式保存信息。
income = []
spend = []
deposit = 0
#value|specification
while 1:
content = input("请输入指令:")
if content.find("exit")!=-1:
break
if content.find("|")==-1:
print("data format is value|specification")
print("please input again!")
continue
value = content.split("|")[0]
try:
value=float(value)
except:
print("data format is value|specification")
print("data format is value must be a number")
if value>0:
income.append(content)
deposit+=value
elif value==0:
print("空间有限,不存0")
else:
spend.append(content[1:])
deposit+=value
print(income)
print(spend)
print(deposit)
使用序列化:
import pickle
fp = open("f:\\a.txt","rb")
try:
income=pickle.load(fp)
spend=pickle.load(fp)
deposit=pickle.load(fp)
except:
income = []
spend = []
deposit = 0
fp.close()
#value|specification
while 1:
content = input("请输入指令:")
if content.find("exit")!=-1:
break
if content.find("|")==-1:
print("data format is value|specification")
print("please input again!")
continue
value = content.split("|")[0]
try:
value=float(value)
except:
print("data format is value|specification")
print("data format is value must be a number")
if value>0:
income.append(content)
deposit+=value
elif value==0:
print("空间有限,不存0")
else:
spend.append(content[1:])
deposit+=value
print(income)
print(spend)
print(deposit)
fp = open("f:\\a.txt","wb")
pickle.dump(income,fp)
pickle.dump(spend,fp)
pickle.dump(deposit,fp)
fp.close()
练习:
处理数据文件:
每行内容需要生成以每行首年月日为名称的文件,
文件内容写入|0|后的所有行内容(也包括|0| )
数据文件:data.log
20160215 000148|0|collect info job start|success|
20160215000153|0|collect info job
end|success|resultcode = 0000
20160216000120|0|collect info job start|success|
20160216000121|0|collect info job
end|success|resultcode = 0000
20160217000139|0|collect info job start|success|
20160217000143|0|collect info job
end|success|resultcode = 0000
算法分析:
➢遍历每一行,每行取头14个字母
➢新建文件,文件名为首14个字母,然后把第15字符后的所有字
符拷贝到文件中
➢关闭文件
with open("f:\\a.txt",encoding="utf-8") as fp:
for line in fp:
print(line)
file_name = line.split("|",1)[0]
file_content = line.split("|",1)[1]
with open("f:\\"+file_name+".txt","w") as fp1:
fp1.write("|"+file_content+"\n")
怎么判断一个字符串是文件还是目录:
import os.path
os.path.isdir(“workspace”)
True
os.path.isfile(“workspace”)
False
小练习:删除你某个路径下文件名为.txt的所有文件。
import os
os.getcwd()
dir_path = os.getcwd()
for i in os.listdir(dir_path):
print(dir_path+"\\"+i)
if ".txt" == i[-4:]:
os.remove(dir_path+"\\"+i)
练习:
取出某个目录内1小时内新建的所有的文件名。
算法:遍历这个目录,取到所有的文件
每个文件用stat取到创建时间
用创建时间和当前时间去比对,是否小于3600s
放到一个列表里面
import os
import time
import os.path
current_timestamp = time.time()
result = []
for i in os.listdir("f:\\"):
if os.path.isfile("f:\\"+i):
if current_timestamp-os.stat("f:\\"+i).st_ctime <=3600:
result.append("f:\\"+i)
print(result)
小练习:
把所有的txt文件干掉,新建一个空的子目录xxx,放在某个层级下,把它删掉。
import os
dir_count = 0
file_count = 0
for root,dirs,files in os.walk("f:\\testdemo",topdown=True):
print(u"当前目录:",root)#打印目录绝对路径
for name in files:
print(u"文件名:",os.path.join(root,name))#打印文件绝对路径
if name[-4:]==".txt":
os.remove(os.path.join(root,name))
file_count+=1
for name in dirs:
print(u"目录名:",name)#打印目录绝对路径
if name =="xxx":
os.rmdir(os.path.join(root,name))
dir_count+=1
print("目录个数%s"%dir_count)
print("文件个数%s"%file_count)
练习:统计某个路径下的绝对路径和绝对路径下的文件。
def get_dir_abs_dirpath(dir_path):
result = []
for root,dirs,files in os.walk(dir_path):
for i in dirs:
result.append(os.path.join(root,i))
return result
def get_dir_abs_filepath(dir_path):
result = []
for root,dirs,files in os.walk(dir_path):
for i in files:
result.append(os.path.join(root,i))
return result
print(get_dir_abs_dirpath("f:\\testdemo"))
print(get_dir_abs_filepath("f:\\testdemo"))
练习:统计下某个目录下的所有不同后缀名的个数以及哪些具体的后缀名。
def get_postfix_name_count(dir_path):
result = []
for root,dirs,files in os.walk(dir_path):
for i in files:
postfix_name = os.path.splitext(os.path.join(root,i))[1]
print(postfix_name)
if postfix_name!="":
result.append(postfix_name[1:])
return list(set(result)),len(set(result))
print(get_postfix_name_count("f:\\testdemo"))