LZW编码采用隐字典码的形式完成压缩。
文本中符号并不是独立存在的,前一个符号对后一个符号的出现有着很大影响。
LZW算法利用文本开头部分的特征,作为整个文本的特征,即利用文本开头部分的内容,生成固定规模的字典,即符号–码符号对,然后利用于整个文本,将文本符号转化为码符号。
LZW首先要有初始字典(可以为空),再通过文本符号添加字典中的元素。每次读取文本中一个符号,若该符号已出现在字典中,则将改符号作为前缀,继续读取下一位。
例如
已有字典{‘A’:0,‘B’:1,‘C’:2},字符串’AAABABC’,

  1. 第一步读取’A’,‘A’已存在于字典中,所以’A’作为前缀,读取字符串后一位’A’,此时当前符号为’AA’,没在字典中,于是字典添加符号–码符号对’AA’:3,字典更新为{‘A’:0,‘B’:1,‘C’:2,‘AA’:3}。
  2. 清空前缀,读取字符串第三位’A’,‘A’在字典中,于是’A’作为前缀,读取下一位’B’,当前符号为’AB’,没在字典中,于是添加符号–码符号对’AB’:4,字典更新为{‘A’:0,‘B’:1,‘C’:2,‘AA’:3,‘AB’:4}
  3. 清空前缀,读取字符串第五位’A’,‘A’位于字典中,于是’A’作为前缀,读取下一位’B’,当前符号为’AB’,‘AB’在字典中,于是’AB’作为前缀,读取下一位’C’,当前符号为’ABC’,没在字典中,于是字典更新为{‘A’:0,‘B’:1,‘C’:2,‘AA’:3,‘AB’:4,‘ABC’:5}。

{‘A’:0,‘B’:1,‘C’:2,‘AA’:3,‘AB’:4,‘ABC’:5}即为{‘A’:0,‘B’:1,‘C’:2}根据字符串’AAABABC’生成的字典。
LZW常用ASCII码作为初始字典,生成字典的值从255开始。实现时,更新字典的同时需要记录下文本符号对应的码符号。
具体步骤为

  1. 生成初始字典
keys=[]
values=[]
for i in range(255):keys.append(chr(i))values.append(i)
  1. 更新字典
Path='C:\Users\88466\Desktop\Gone with the wind.txt'# 文本路径
with open(Path,'r') as f1:data_string=fi.read()
digit=12 #生成字典的大小,12即表示字典有2的12次方个元素,常取12,16
Compress_list=[] #存放文本符号对应的码符号
pW_s=''          #前缀字符串
temp_index=len(keys)
max_time=len(data_string)
i=0
while(i<max_time):cW_s=data_string[i] #当前字符串#该结构用于判断是否data_string是否全部读取完毕try:sW_s=data_string[i+1]except:Compress_list.append(values[keys.index(cW_s)])breaktemp_index=temp_index+1if cW_s+sW_s in keys:while(cW_s+sW_s in keys):i=i+1cW_s=cW_s+sW_stry:sW_s=data_string[i+1]except:Compress_list.append(values[keys.index(cW_s)])breakkeys.append(cW_s+sW_s)values.append(temp_index-1)try:Compress_list.append(values[keys.index(cW_s)])except:print('未记录:',cW_s)i=i+1if len(keys)>=2**digit:break#keys与values即为更新的字典
  1. 利用字典将文本符号转为码符号
while(i<max_time):b=0cW_s=data_string[i]try:sW_s=data_string[i+1]except:Compress_list.append(values[keys.index(cW_s)])breakwhile(cW_s+sW_s in keys):i=i+1cW_s=cW_s+sW_stry:sW_s=data_string[i+1]except:Compress_list.append(values[keys.index(cW_s)])breaktry:Compress_list.append(values[keys.index(cW_s)])except:print('未记录:',cW_s)i=i+1#Compress_list为0~2^digit的数字,即为文本符号对应的码符号。
  1. 压缩
#将列表转为二进制字符串
def list2bit_string(li):bitstring=''for i in range(len(li)):temp_string=bin(li[i]).split('b')[1]while(len(temp_string)<digit):temp_string='0'+temp_stringbitstring=bitstring+temp_stringreturn bitstring
Compress_bit_string=list2bit_string(Compress_list)
print('字符串生成完成,字符串总长度为',len(Compress_bit_string))
#将二进制字符串转为字节流
def bit_string2bytes(bs):bt=bytearray()time=round(len(bs)/8)for i in range(time):bs_k=int(bs[i*8:(i+1)*8],2)bt.append(bs_k)bt.append(int(bs[-4:],2))return bytes(bt)
Compress_bytes=bit_string2bytes(Compress_bit_string)
print('字节流生成完成')
with open('Compress_Gone with the wind','wb') as f2:f2.write(Compress_bytes)
print('存储完成')
  1. 解压缩,由于采用的是隐字典,即字典隐藏在码符号中,解压缩时要将字典还原回去。

(1)获取码符号


with open('Compress_Gone with the wind','rb') as f3:Compress_bytes=f3.read()#将二进制字节流转为二进制字符串流
def bytes2bitstring(byte):bs=''for i in byte:bs_k=str(bin(i)).split('b')[1]while len(bs_k)<8:bs_k='0'+bs_kbs=bs+bs_kbs=bsreturn bs
Compress_bit_string=bytes2bitstring(Compress_bytes)
print('字符串转换完成,字符串总长度为',len(Compress_bit_string))
#将字符串流转为列表
def bitstring2list(string):li=[]time=round(len(string)/digit)-1for i in range(time):temp_s=string[digit*i:digit*(i+1)]li.append(int(temp_s,2))return li
Compress_list=bitstring2list(Compress_bit_string)
print('列表转换完成,列表总长度为',len(Compress_list))

(2)生成解压缩字典
例如已有字典{‘A’:0,‘B’:1,‘C’:2},码符号[0,1,1,3,6,2]

  1. 读取码符号0,0在字典中有对应’A’,即表明生成字典时,第一个位置的符号在字典中,但其作为前缀,连接下一位符号就已经不在字典内了,下一个码符号为1,对应’B’,所以此次添加元素为’AB’:3,字典更新为{‘A’:0,‘B’:1,‘C’:2,‘AB’:3}。
  2. 读取码符号1,1在字典中有对应’B’,下一个码符号为1,对应’B’,字典更新为{‘A’:0,‘B’:1,‘C’:2,‘AB’:3,‘BB’:4}
  3. 读取码符号1,1在字典中有对应’B’,下一个码符号为3,对应’AB’,表明在生成该字典元素,读取到了码符号1对应的’B’及码符号3对应的首符号’A’时添加了元素,即此次添加元素为’BA’:5,字典更新为{‘A’:0,‘B’:1,‘C’:2,‘AB’:3,‘BB’:4,‘BA’:5}
  4. 读取码符号3,3在字典中有对应’AB’,字典此次添加的符号定以’AB’开头,下一个码符号为6,其首符号为’A’,所以此次添加元素’ABA’:6,字典更新为{‘A’:0,‘B’:1,‘C’:2,‘AB’:3,‘BB’:4,‘BA’:5,‘ABA’:6}
  5. 读取码符号2,2在字典中对应’C’,且已为最后一个码符号,字典不再更新。

由上述步骤可见,每读取一个码符号,就要再字典中添加一次元素,又由于添加的元素可能会已此次添加的元素的首符号有关,因此字典分两部分生成,每读一位,补齐该位置字典符号并添加下一位置字典的首符号

具体实现为:

keys=[]
values=[]
for i in range(255):keys.append(chr(i))values.append(i)
extra_keys=[] #为方便索引,将新字典单独生成
extra_values=[]
pW_n=Compress_list[0]# 翻译的第一个数字
pW_s=keys[values.index(pW_n)]# 第一个数字在字典中对应的符号
unCompress_string=pW_s
temp_index=1
for i in range(1,len(Compress_list)):extra_keys.append(pW_s)extra_values.append(temp_index+len(keys)-1)cW_n=Compress_list[i]if cW_n in extra_values:cW_s=extra_keys[cW_n-len(keys)]else:cW_s=keys[values.index(cW_n)]#由于每读一位再添加一个字典中的元素,而添加元素时可能会用到当前符号的首符号,因此字典分两部分生成,每读一位,补齐该位置字典符号并添加下一位置字典的首符号extra_keys[temp_index-1]=extra_keys[temp_index-1]+cW_s[0]if cW_n in extra_values:pW_s=extra_keys[cW_n-len(keys)]else:pW_s=keys[values.index(cW_n)]unCompress_string=unCompress_string+pW_stemp_index=temp_index+1if len(extra_keys)+len(keys)>=2**digit:breakprint('翻译到列表第{0}个元素'.format(i))
print('字典构造完成','其长度为',len(extra_keys)+len(keys))
keys=keys+extra_keys
values=values+extra_values

(3)根据解压缩字典将码符号翻译回文本符号

while(i<len(Compress_list)):cW_n=Compress_list[i]if i/100000==round(i/100000):print('已解压缩字符串长度为',len(unCompress_string))try:unCompress_string=unCompress_string+keys[cW_n]except:print('未记录:',cW_n)i=i+1
print('解码完成')
with open('unCompress_Gone with the wind.txt','w',encoding='ANSI') as f4:f4.write(unCompress_string)
print('解压缩完成')

再此基础上用tkinter设计界面

import xlrd
import xlwt
import sys
import tkinter
import tkinter.filedialog
import tkinter.messagebox
import tkinter.ttk
import os
import os.path#压缩
def Compress():Directory=os.path.split(ToBeCompressPath.get())[0]ToBeCompressName=os.path.split(ToBeCompressPath.get())[1]Path=ToBeCompressPath.get().replace('/','\\')                        filename=ToBeCompressName.split('.')[0]digit=int(combo_Compress_digit.get())#生成初始字典keys=[]values=[]for i in range(255):keys.append(chr(i))values.append(i)with open(Path,'r') as f1:data_string=f1.read()##将中文标点转为英文标点Chinese_symbols=['‘','’','。','—','“','”','(',')',':',';','、','?','!','…']English_symbols=["'","'",'.','-','"','"','(',')',':',';','/','?','!','...']#将字符串转为列表def str2list(string):List=[]for i in range(len(string)):List.append(string[i])return Listdata_list=str2list(data_string)#将中文字符替换为英文字符for i in range(len(data_list)):if data_list[i] in Chinese_symbols:data_list[i]=English_symbols[Chinese_symbols.index(data_list[i])]#将列表转为字符串def list2str(List):string=''for i in range(len(List)):string=string+str(List[i])return stringdata_string=list2str(data_list)#生成字典Compress_list=[]pW_s=''temp_index=len(keys)max_time=len(data_string)i=0while(i<max_time):cW_s=data_string[i]try:sW_s=data_string[i+1]except:Compress_list.append(values[keys.index(cW_s)])breaktemp_index=temp_index+1if cW_s+sW_s in keys:while(cW_s+sW_s in keys):i=i+1cW_s=cW_s+sW_stry:sW_s=data_string[i+1]except:Compress_list.append(values[keys.index(cW_s)])breakkeys.append(cW_s+sW_s)values.append(temp_index-1)try:Compress_list.append(values[keys.index(cW_s)])except:print('未记录:',cW_s)i=i+1if len(keys)>=2**digit:breakprint('字典构造完成','其长度为',len(keys))workbook=xlwt.Workbook()sheet=workbook.add_sheet('1')sheet.write(0,0,'键')sheet.write(0,1,'值')for i in range(len(keys)):sheet.write(i+1,0,keys[i])sheet.write(i+1,1,values[i])workbook.save(Directory+'/Compress_directory_'+filename+'.xls')#放字典目录Compress_directory_Path.set(Directory+'/Compress_directory_'+filename+'.xls')#编码while(i<max_time):b=0cW_s=data_string[i]try:sW_s=data_string[i+1]except:Compress_list.append(values[keys.index(cW_s)])breakwhile(cW_s+sW_s in keys):i=i+1cW_s=cW_s+sW_stry:sW_s=data_string[i+1]except:Compress_list.append(values[keys.index(cW_s)])breaktry:Compress_list.append(values[keys.index(cW_s)])except:print('未记录:',cW_s)i=i+1labelName=tkinter.Label(root,text=str(100*i/max_time)+'%',justify=tkinter.RIGHT,anchor='e',width=80)labelName.place(x=600,y=60,width=30,height=20)if i/100000==round(i/100000):print('已压缩字符',i)print('编码完成,列表总长度为',len(Compress_list))#存储#将列表转为二进制字符串def list2bit_string(li):bitstring=''for i in range(len(li)):temp_string=bin(li[i]).split('b')[1]while(len(temp_string)<digit):temp_string='0'+temp_stringbitstring=bitstring+temp_stringreturn bitstringCompress_bit_string=list2bit_string(Compress_list)print('字符串生成完成,字符串总长度为',len(Compress_bit_string))#将二进制字符串转为字节流def bit_string2bytes(bs):bt=bytearray()time=round(len(bs)/8)for i in range(time):bs_k=int(bs[i*8:(i+1)*8],2)bt.append(bs_k)bt.append(int(bs[-4:],2))return bytes(bt)Compress_bytes=bit_string2bytes(Compress_bit_string)print('字节流生成完成')with open(Directory+'/Compress_'+filename,'wb') as f2:f2.write(Compress_bytes)print('存储完成')CompressPath.set(Directory+'/Compress_'+filename)#输出压缩效率size_before=os.path.getsize(ToBeCompressPath.get())size_after=os.path.getsize(CompressPath.get())theta=int(10000*(1-size_after/size_before))theta=str(theta/100)labelName=tkinter.Label(root,text=theta+'%',justify=tkinter.RIGHT,anchor='e',width=80)labelName.place(x=130,y=185,width=50,height=20)#解压缩
def unCompress():Directory=os.path.split(CompressPath.get())[0]CompressName=os.path.split(CompressPath.get())[1]Path=CompressPath.get().replace('/','\\')                        filename=CompressName.split('.')[0]digit=int(combo_unCompress_digit.get())with open(Path,'rb') as f3:Compress_bytes=f3.read()#将二进制字节流转为二进制字符串流def bytes2bitstring(byte):bs=''for i in byte:bs_k=str(bin(i)).split('b')[1]while len(bs_k)<8:bs_k='0'+bs_kbs=bs+bs_kbs=bsreturn bsCompress_bit_string=bytes2bitstring(Compress_bytes)print('字符串转换完成,字符串总长度为',len(Compress_bit_string))#将字符串流转为列表def bitstring2list(string):li=[]time=round(len(string)/digit)-1for i in range(time):temp_s=string[digit*i:digit*(i+1)]li.append(int(temp_s,2))return liCompress_list=bitstring2list(Compress_bit_string)print('列表转换完成,列表总长度为',len(Compress_list))keys=[]values=[]for i in range(255):keys.append(chr(i))values.append(i)#生成解压缩字典extra_keys=[]extra_values=[]pW_n=Compress_list[0]pW_s=keys[values.index(pW_n)]unCompress_string=pW_stemp_index=1for i in range(1,len(Compress_list)):extra_keys.append(pW_s)extra_values.append(temp_index+len(keys)-1)cW_n=Compress_list[i]if cW_n in extra_values:cW_s=extra_keys[cW_n-len(keys)]else:cW_s=keys[values.index(cW_n)]extra_keys[temp_index-1]=extra_keys[temp_index-1]+cW_s[0]if cW_n in extra_values:pW_s=extra_keys[cW_n-len(keys)]else:pW_s=keys[values.index(cW_n)]unCompress_string=unCompress_string+pW_stemp_index=temp_index+1if len(extra_keys)+len(keys)>=2**digit:breakprint('翻译到列表第{0}个元素'.format(i))print('字典构造完成','其长度为',len(extra_keys)+len(keys))keys=keys+extra_keysvalues=values+extra_valuesworkbook=xlwt.Workbook()sheet=workbook.add_sheet('1')sheet.write(0,0,'键')sheet.write(0,1,'值')for i in range(len(keys)):sheet.write(i+1,0,keys[i])sheet.write(i+1,1,values[i])workbook.save(Directory+'/unCompress_directory_'+filename+'.xls')#显示解压缩字典目录unCompress_directory_Path.set(Directory+'/unCompress_directory_'+filename+'.xls')#解压缩while(i<len(Compress_list)):cW_n=Compress_list[i]if i/100000==round(i/100000):print('已解压缩字符串长度为',len(unCompress_string))try:unCompress_string=unCompress_string+keys[cW_n]except:print('未记录:',cW_n)i=i+1print('解码完成')with open(Directory+'/unCompress_'+filename+'.txt','w',encoding='ANSI') as f4:f4.write(unCompress_string)print('解压缩完成')#显示解压缩文件目录unCompress_Path.set(Directory+'/unCompress_'+filename+'.txt')##窗口设计
root=tkinter.Tk()#窗口大小
root.title('英文文本编码器')
root['height']=220
root['width']=670#放'待压缩文件'
labelName=tkinter.Label(root,text='待压缩文件:',justify=tkinter.RIGHT,anchor='e',width=80)
labelName.place(x=30,y=30,width=80,height=20)#放'待压缩文件'后的框
ToBeCompressPath=tkinter.StringVar(root,value='')
entry_ToBeCompressPath=tkinter.Entry(root,width=80,textvariable=ToBeCompressPath)
entry_ToBeCompressPath.place(x=120,y=30,width=350,height=20)#放'待压缩文件'的'...'钮
def open_file1():ToBeCompressPath.set(tkinter.filedialog.askopenfilename())button_op1=tkinter.Button(root,text='...',command=open_file1)
button_op1.place(x=470,y=30,width=20,height=20)#放'压缩位数为'
labelName=tkinter.Label(root,text='压缩位数为:',justify=tkinter.RIGHT,anchor='e',width=80)
labelName.place(x=500,y=30,width=90,height=20)#放'位数为'后的复选框
digit_list=[9,10,11,12,13,14,15,16]combo_Compress_digit=tkinter.ttk.Combobox(root,width=50,values=digit_list)combo_Compress_digit.current(3)
combo_Compress_digit.place(x=590,y=30,width=40,height=20)#放'压缩'钮button_Compress=tkinter.Button(root,text='压缩',command=Compress)button_Compress.place(x=530,y=60,width=50,height=20)#放'压缩字典:'
labelName=tkinter.Label(root,text='压缩字典:',justify=tkinter.RIGHT,anchor='e',width=80)
labelName.place(x=30,y=60,width=80,height=20)#放字典目录
Compress_directory_Path=tkinter.StringVar(root,value='')
entry_Compress_directory_Path=tkinter.Entry(root,width=80,textvariable=Compress_directory_Path)
entry_Compress_directory_Path.place(x=120,y=60,width=350,height=20)
#放'压缩文件:'
labelName=tkinter.Label(root,text='压缩文件:',justify=tkinter.RIGHT,anchor='e',width=80)
labelName.place(x=30,y=90,width=80,height=20)#放'压缩文件:'后的框
CompressPath=tkinter.StringVar(root,value='')
entry_ToBeCompressPath=tkinter.Entry(root,width=80,textvariable=CompressPath)
entry_ToBeCompressPath.place(x=120,y=90,width=350,height=20)#放'压缩文件'的'...'钮
def open_file2():CompressPath.set(tkinter.filedialog.askopenfilename())button_op2=tkinter.Button(root,text='...',command=open_file2)
button_op2.place(x=470,y=90,width=20,height=20)#放'解压缩位数为'
labelName=tkinter.Label(root,text='解压缩位数为:',justify=tkinter.RIGHT,anchor='e',width=80)
labelName.place(x=500,y=90,width=90,height=20)#放'解压缩位数为'后的复选框
digit_list=[9,10,11,12,13,14,15,16]combo_unCompress_digit=tkinter.ttk.Combobox(root,width=50,values=digit_list)combo_unCompress_digit.current(3)
combo_unCompress_digit.place(x=590,y=90,width=40,height=20)#放'解压缩'钮button_unCompress=tkinter.Button(root,text='解压缩',command=unCompress)button_unCompress.place(x=530,y=120,width=50,height=20)#放'解压缩字典:'
labelName=tkinter.Label(root,text='解压缩字典:',justify=tkinter.RIGHT,anchor='e',width=80)
labelName.place(x=30,y=120,width=80,height=20)#放'解压缩字典:'后的框
unCompress_directory_Path=tkinter.StringVar(root,value='')
entry_unCompress_directory_Path=tkinter.Entry(root,width=80,textvariable=unCompress_directory_Path)
entry_unCompress_directory_Path.place(x=120,y=120,width=350,height=20)#放'解压缩文件:'
labelName=tkinter.Label(root,text='解压缩文件:',justify=tkinter.RIGHT,anchor='e',width=80)
labelName.place(x=30,y=150,width=80,height=20)#放'解压缩文件:'后的框
unCompress_Path=tkinter.StringVar(root,value='')
entry_unCompress_Path=tkinter.Entry(root,width=80,textvariable=unCompress_Path)
entry_unCompress_Path.place(x=120,y=150,width=350,height=20)#放'压缩效率:'
labelName=tkinter.Label(root,text='压缩效率:',justify=tkinter.RIGHT,anchor='e',width=80)
labelName.place(x=50,y=180,width=80,height=20)root.mainloop()

Python实现英文文本的LZW编码压缩相关推荐

  1. Python实现英文文本的霍夫曼编码压缩

    霍夫曼编码作为变长码,在已知字符出现的频率的前提下,将频率高的字符用短码表示,频率低的字符用长码表示,实现用最短的码符号完整的表示出一段文本的信息. 例如 对于 这样一文本,进行字符频率统计,部分结果 ...

  2. 【Python】英文文本分词与词频统计(split()函数、re库)

    英文文本分词 1.知识准备 (1)Python中的split()函数的用法 了解split()的基本用法 (2)python多个分割符split字符串 了解re库的部分用法 Python strip( ...

  3. python统计英文文本词频和提取文本关键词

    统计一段英文的词频,以下代码只将标点符号省去,没有去除英文中介词,数词,人称代词等,如需要改进在统计时候直接去除相应词汇即可. #读取文本 txt = open("english.txt&q ...

  4. python英文文本情感分析_舆情信息浩如烟海?看看如何用Python进行英文文本的情感分析...

    市场每天都在生成海量的舆情信息,这些信息可以帮助我们识别市场情绪的转变.如果只是人工地去跟踪大量的舆论和研报显然缺乏效率.我们可以试试让机器来完成这个工作. 数据科学在数值领域中很常见,但这个不断壮大 ...

  5. pythongbk编码怎么解决_如何解决 Python print 输出文本显示 gbk 编码错误

    前阵子想爬点东西,结果一直提示错误UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position,在网上一查,发现是 ...

  6. Python NLP英文文本转小写

    使用方法如下: def lower_word(all_content):for i, content in enumerate(all_content):all_content[i] = conten ...

  7. 基于Python实现的英文文本信息检索系统

    目录 1.用户交互的实现: 3 3.查询表的建立 6 3.1 预处理 6 3.2 倒排表的构建 8 3.3 倒排表的压缩 9 3.4 构建轮排索引 10 4.布尔查询 11 5.TF-IDF 值的计算 ...

  8. python英文文本分析和提取_英文文本挖掘预处理流程总结

    在中文文本挖掘预处理流程总结中,我们总结了中文文本挖掘的预处理流程,这里我们再对英文文本挖掘的预处理流程做一个总结. 1. 英文文本挖掘预处理特点 英文文本的预处理方法和中文的有部分区别.首先,英文文 ...

  9. 哈夫曼压缩(一)——英文文本

    本文主要介绍如何实现哈夫曼压缩以及提高哈夫曼压缩过程的读写速率,对于哈夫曼树的概念及其构造则没有介绍,感兴趣的朋友可以先百度一下了解相关知识. 一.哈夫曼压缩原理 哈夫曼压缩是一种无损的压缩算法,在压 ...

最新文章

  1. c# 自然序号,在C#中的自然排序
  2. 一起学nRF51xx 4 -  int
  3. Computer:路由器、交换机、猫Modem的简介、区别之详细攻略
  4. RabbitMQ学习(七)_RabbitMQ Consumer获取消息的两种方式(poll,subscribe)解析
  5. 【干货】推荐系统中的机器学习算法与评估实战
  6. JSP Unable to compile class for JSP
  7. 原创案例文章:安徽淮南矿业集团网络分析案例
  8. 动态规划---01背包问题--Dp(详解附代码)
  9. 为什么计算机的游戏打开不了,为什么电脑桌面游戏菜单打不开
  10. STM32F103使用硬件i2c作为从机模式
  11. SOLIDWORKS教程:solidworks设计绘图的七大实用技巧
  12. 锐捷服务器系统安全,更安全 锐捷网络发布RG-ESS易安全系统
  13. 校内互测题 by LMY (FSN)
  14. 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第4章 分治策略
  15. 华为OD机试真题 Python 实现【机器人】【100%通过率】【2022.11 Q4 新题】
  16. Docker学习(五):Docker网络
  17. libreCAD源码阅读笔记1
  18. linux实验二文件与文件夹操作
  19. Python-Tkinter和PyInstaller简介及定时关机程序的简易实现
  20. 基于yolov5的火焰识别

热门文章

  1. 易语言5.9破解方法
  2. pandas 如何从1开始索引
  3. 计算机配置怎么开启,ipv6怎么设置? ipv6的开启方法
  4. Windows CE操作系统的触摸屏驱动程序模型
  5. 【甲骨文公司高层】谈2018年容器原生应用程序的发展
  6. 2023届秋招图像算法岗面经记录(TPlink(普联)、潮州三环、中电十所、科大讯飞、旷视、超参数、虹软、大华、速腾聚创、中兴、哲库、字节、OPPO、百度、之江实验室、蚂蚁、Intel、小米)
  7. MQTT协议-MQTT协议简介及协议原理
  8. Linux下的磁盘加密方法
  9. android textview 添加图片大小,Android_Android中使用TextView实现图文混排的方法,向TextView或EditText中添加图像比 - phpStudy...
  10. 虚拟机的三种联网方式