作业20190429

相关标签: # python# mysql# sql# 设备# 信息
作业20190429
文章目录
- 作业20190429
- 1. 指定一个源文件,实现copy到目标目录
- 2.复制目录
- 3.单词统计
- 4.单词统计进阶
- 5.配置文件转换
- 6.实现ls命令功能
1. 指定一个源文件,实现copy到目标目录
例如:吧/tmp/test.txt 拷贝到/tmp/test1.txt
from pathlib import Path,os
import shutil
#定义源文件
p = Path("one/b/text.txt")
if not p.parent.exists():
p.parent.mkdir(parents=True)
p.write_text("我是源文件")
#定义目标文件
des = Path("one2/b/abc.txt")
if not des.parent.exists():
des.parent.mkdir(parents=True)
#拷贝源文件到目标文件
# shutil.copy2(p,des)
with open(p,"rb",) as src:
with open(des,"wb") as f:
buffer = 16*1024
while 1:
temp = src.read(buffer);
if not temp:
break
f.write(temp)
shutil.copystat(p,des)
2.复制目录
- 选择一个已经存在的目录作为当前工作目录,在其下创建a/b/c/d这样的子目录结构
在这些子目录的不同层级生成50个普通文件。要求文件名由随机4个小写字母构成。 - 将a目录下所有内容复制到当前工作目录dst目录下去,要求复制的普通文件名必须是x,y,z开头
举例:假设工作目录时/tmp,构建的目录结构是/tmp/a/b/c/d.在a、b、c、d目录中放入随机生成的文件,这些文件名称也是随机生成的。
最终把a目录下所有的目录也就是b,c,d目录,和文件名开头是x,y,z开头的文件
import pathlib,shutil,random,os,string,re
#检测目录环境是否干净,如果有清空。
trepdir = pathlib.Path("a")
if trepdir.exists():
shutil.rmtree(trepdir)
#开始
down = pathlib.Path("")
src = pathlib.Path(down,"a/b/c/d")
if not src.exists():
src.mkdir(parents=True)
arrpath = [] #记录创建文件可能出现的目录
temp = src
while temp!=down:
arrpath.append(temp)
temp = temp.parent
# 创建文件
for i in range(50):
os.close(os.open(str(arrpath[random.randint(0,3)])+"/"+"".join(random.choices(string.ascii_lowercase,k=4)),os.O_CREAT))
# 创建复制文件路径
targe = pathlib.Path(down,"dst/")
# def fun(src,names):
# rexit = re.compile('^[xyz].*')
# reset = set()
# for i in names:
# if pathlib.Path(src,i).is_dir():
# continue
# elif rexit.match(i):
# continue
# else:
# reset.add(i)
# return reset
#fun =lambda src,names: {*filter(lambda name: not re.compile('^[xyz].*').match(name),(i for i in names if not pathlib.Path(src,i).is_dir()))}
#使用一行解决
fun = lambda src,names:{name for name in names if not pathlib.Path(src,name).is_dir() and not re.compile('^[xyz].*').match(name)}
#检测拷贝目录是否干净,如果存在清空
if targe.exists():
shutil.rmtree(targe)
#拷贝
shutil.copytree(pathlib.Path("a"),targe,ignore=fun)
- 第二种进阶版:
#第二种实现
import shutil,random,os,string,re
from pathlib import Path
#检测目录环境是否干净,如果有清空。
trepdir = pathlib.Path("a")
if trepdir.exists():
shutil.rmtree(trepdir)
#定义当前工作目录
down = Path("")
#定义目录结构
src = Path("a/b/c/d")
arrpath = [src] + list(src.parents)[:-1]
#如果目录不存在创建目录。
if not src.exists(): src.mkdir(parents=True)
#生成50个文件
for i in range(50):
(down / random.choice(arrpath) / "".join(random.choices(string.ascii_lowercase,k=4))).touch()
#定义拷贝目录
targetdir = Path(down,"dst/")
#检测拷贝目录是否干净,如果存在清空
if targe.exists():
shutil.rmtree(targe)
#定义过滤函数
def fun(src,names,rexit=set("xyz")):
return {*filter(lambda name: (name[0] not in rexit and not pathlib.Path(src,name).is_dir()),names)}
#拷贝
shutil.copytree(pathlib.Path("a"),targe,ignore=fun)
3.单词统计
有一个文件,对其进行单词统计,不区分大小写,并显示单词重复最多的10个单词。
from pathlib import Path
from collections import OrderedDict
class xdddict:
def __init__(self):
self.xdict = OrderedDict()
self.sortxdict = None
#统计单词
def countword(self,arr:list):
for word in arr:
word = word.lower()
self.xdict[word] = self.xdict.get(word,0)+1
# 刷新排序列表
def refreshsortxdict(self):
self.sortxdict = sorted(self.xdict.items(),key = lambda x:x[1],reverse=True)
#获取top10
def getTop10(self):
if not self.sortxdict:
self.refreshsortxdict()
return self.sortxdict[:10]
fil = Path("sample.txt")
worddict = xdddict()
with fil.open(encoding="utf-8",newline="") as f:
arr = [",",".","(",")","-","/",".."]
for line in f:
line = line.strip()
for i in arr:
line = line.replace(i," ")
worddict.countword(line.split())
print(worddict.getTop10())
4.单词统计进阶
在上一题基础之上,要求用户可以排除一些单词的统计,例如:a、the、of等不应该出现在具有实际意义的统计中。应当忽略。
要求代码使用函数封装,并调用完成
from pathlib import Path
from collections import OrderedDict
class xdddict:
def __init__(self,overlook:set=None):
self.xdict = OrderedDict()
self.sortxdict = None
if overlook==None:
self.overlook = set()
else:
self.overlook = {i.lower() for i in overlook}
#统计单词
def countword(self,arr:list):
for word in arr:
word = word.lower()
#过滤不需要统计的单词
if word in self.overlook: continue
self.xdict[word] = self.xdict.get(word,0)+1
# 刷新排序列表
def refreshsortxdict(self):
self.sortxdict = sorted(self.xdict.items(),key = lambda x:x[1],reverse=True)
#获取top10
def getTop10(self):
if not self.sortxdict:
self.refreshsortxdict()
return self.sortxdict[:10]
fil = Path("sample.txt")
overlook = {"the","is","a","of","and","to","on","return","os","if","in","are","as",
"for","an","this","or","true","false","not","be","by","that"}
worddict = xdddict(overlook)
with fil.open(encoding="utf-8",newline="") as f:
arr = [",",".","(",")","-","/","..","`s"]
for line in f:
line = line.strip()
for i in arr:
line = line.replace(i," ")
worddict.countword(line.split())
print(worddict.getTop10())
- 第二种进阶版
from pathlib import Path
class word:
def __init__(self):
self.worddict = {} #记录单词数量字典
pass
#根据行获取单词,过滤不必要字符
def deallist(self,line:str,outchar = set("""~!@#$/\%^&*()_+-'"\r\n., """)):
k=0
leng = len(line)
for i,one in enumerate(line):
if one in outchar:
if k!=i:
yield line[k:i].lower()
k = i + 1
if k<leng:
yield line[k:].lower()
#统计单词
def countword(self,filepath:Path,encoding=None,stopwords=set()):
with Path(filepath).open("r",encoding=encoding) as f:
for line in f:
for word in filter(lambda word: word not in stopwords,self.deallist(line)):
self.worddict[word] = self.worddict.get(word,0)+1
def getTopWord(self,top=10):
return sorted(self.worddict.items(),key=lambda k: k[1],reverse=True)[:10]
if __name__== "__main__":
wd = word() #创建单词统计类
stopwords = {"the","is","a","of","and","to","on","return","os","if","in","are","as",
"for","an","this","or","true","false","not","be","by","that"} #定义停用单词
wd.countword(Path("sample.txt"),"utf-8",stopwords=stopwords) #开始统计单词
print(wd.getTopWord()) #获取统计前10名
5.配置文件转换
有一个配置文件test.ini内容如下,将其转换成json格式文件
[DEFAULT]
a = test
[mysql]
default-character-set=utf8
a=1000
[mysqld]
datadir = /dbserver/data
port = 33060
character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- 代码如下:
import json,configparser
from pathlib import Path
initxt = """\
[DEFAULT]
a = test
[mysql]
default-character-set=utf8
a=1000
[mysqld]
datadir = /dbserver/data
port = 33060
character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
"""
#配置作业环境(创建文件)
with open("mysql.ini","wb") as f:
f.write(initxt.encode(encoding="utf-8"))
#读取文件
cfg = configparser.ConfigParser()
cfg.read("mysql.ini",encoding="utf-8")
#转换json
dt = {}
for i in cfg.items():
dt[i[0]] = {k:v for k,v in cfg.items(i[0])}
js = json.dumps(dt)
print(js)
6.实现ls命令功能
实现ls命令功能,实现 -l,-a,和-all、-h选项
- 实现显示路径下的文件列表
- -a和-all显示包含.开头的文件
- -l 详细列表信息
- -h和-l配合,人性化显示文件大小,例如1k,1G,1T等,可以认为1G=1000M
- 类型字符
- c 字符
- d目录
- f普通文件
- l 软连接
- b 块设备
- s socket文件
- p pipe文件,即FIFO
- 使用argparse模块
import argparse,os,datetime
from pathlib import Path
class ls:
def __init__(self):
self.modedict = {0o040000:"d",0o020000:"c",0o060000:"b",0o100000:"f",0o010000:"p",0o120000:"l",0o140000:"s"}
self.units = ["B","K","M","G","T"]
def showdir(self,overlook=False,h=False,l=False,*,paths:list=None):
if not paths:
paths=[""]
for i in paths:
print(i)
arrname = [*Path(i).iterdir()]
arrname.sort(key=lambda p: p.name)
for p in arrname:
if (not overlook) and p.name.startswith("."):
continue
if l:
self.showdir_l(p,h)
else:
print(p.name)
#显示文件详细信息
def showdir_l(self,p:Path,h):
stat = p.stat()
stime = datetime.datetime.fromtimestamp(stat.st_atime).strftime("%Y-%m-%d %H:%M:%S")
print(self.getstrmode(stat.st_mode),stat.st_nlink,stat.st_gid,stat.st_uid,self.getsize(p,h),stime,p.name,sep="\t")
#获取文件大小
def getsize(self,p:Path,h):
size = p.stat().st_size
if h:
i = 0
while size > 1024:
tempsize = int(size/1024)
if not tempsize:
break
else:
i += 1
size = tempsize
size = str(size)+self.units[i]
else:
size = str(size)+"B"
return size
#获取文件权限
def getstrmode(self,mode:int):
strmod = self.modedict.get(mode & 0o170000,"-")
temp = bin(mode)
temp = temp[len(temp)-9:]
i = 2
while i<len(temp):
if temp[i-2]=="1":
strmod += "r"
else:
strmod += "-"
if temp[i-1]=="1":
strmod += "w"
else:
strmod += "-"
if temp[i]=="1":
strmod += "x"
else:
strmod += "-"
i += 3
return strmod+"."
ls = ls()
# ls.showdir()
parser = argparse.ArgumentParser(description="ls 显示当前文件信息",add_help=False)
# 注册属性函数
# parser.add_argument(dest="showdir",action="store_const",const =ls.showdir)
# 添加-a,-all参数
parser.add_argument("-a","-all",dest="overlook",action="store_true")
parser.add_argument("-l",action="store_true")
parser.add_argument("-h",action="store_true")
parser.add_argument("paths",nargs="*")
# args = parser.parse_args() #命令行时启动
args = parser.parse_args("-lah a one ./".split())
# print(args.paths)
ls.showdir(overlook=args.overlook,l=args.l,h=args.h,paths=args.paths)
- 进阶版
#ls命令进阶
import argparse,datetime,stat
from pathlib import Path
class ls :
def listdir(self,overlook=False,h=False,l=False,paths:list=None):
for i in paths:
yield (-1,i)
for p in sorted(Path(i).iterdir(),key=lambda k:k.name): #先排序
if not overlook and p.name[0]==".": #是否显示点开头的文件
continue
if l: #是否显示详细信息
st = p.stat()
stime = datetime.datetime.fromtimestamp(st.st_atime).strftime("%Y-%m-%d %H:%M:%S")
#mode = stat.filemode(st.st_mode) #调用系统filemode获取对应的字符串权限
mode = self.getfiletype(p) + self.getfilemode(st.st_mode)
yield (mode,st.st_nlink,st.st_uid,st.st_gid,self.getsize(st.st_size,h),stime,p.name)
else:
yield (p.name,)
#获取文件权限
def getfilemode(self,mode,arr = "rwxrwxrwx"):
return "".join(arr[8-i] if mode >> i & 1 else "-" for i in range(8,-1,-1))
def getfiletype(self,p:Path):
if p.is_dir():
return "d"
elif p.is_block_device():
return "b"
elif p.is_char_device():
return "c"
elif p.is_socket():
return "s"
elif p.is_symlink():
return "l"
else:
return "-"
#获取文件大小
def getsize(self,size,h,unitx = " KMGP"):
if not h:
return str(size)
length = len(unitx)-1
i = 0
while size>1024 and i<length:
size = size//1024
i +=1
return str(size)+ ("" if i==0 else unitx[i])
if __name__ == "__main__":
parser = argparse.ArgumentParser(prog="ls",description="ls 显示文件",add_help=False)
parser.add_argument("-a","-all",dest="overlook",action="store_true")
parser.add_argument("-l",action="store_true")
parser.add_argument("-h",action="store_true")
parser.add_argument("paths",nargs="*",default=["."])
args = parser.parse_args("-lah ./ ../".split())
lsdir = ls()
for i in lsdir.listdir(args.overlook,args.h,args.l,args.paths):
if i[0] == -1:
print("\n",i[1])
else:
if len(i)>1:
print(*i,sep="\t")
else:
print(*i,end="\t",sep="")
文章来源: https://blog.51cto.com/u_8406447/5769447
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报