返回

作业20190429

发布时间:2022-10-22 01:50:09 391
# 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.复制目录

  1. 选择一个已经存在的目录作为当前工作目录,在其下创建a/b/c/d这样的子目录结构
    在这些子目录的不同层级生成50个普通文件。要求文件名由随机4个小写字母构成。
  2. 将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())

作业20190429_作业20190429

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)

作业20190429_mysql_05

  • 进阶版
#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="")

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
javascrip基本知识总结 2022-10-22 01:11:05