1.\w会包括汉字
import re
pat=r'[\w_]{5,19}@[0-9a-zA-Z.]+[comc|n|net]{2,3}'
text=input("")
t=re.compile(pat)
print(re.findall(t,text))
这样查找判断会把邮箱前的汉字也打印出来
避免这种情况可以把\w改成[a-zA-Z0-9_]
或者用下面这种方法
import re
pat=r'[\w_]{5,19}@[0-9a-zA-Z.]+[comc|n|net]{2,3}'
text=input("")
print(re.findall(pat,text,re.A))
注意这种方法不需要compile
2.文件两种输出方法区别
①
txt=open("中文网10.txt","r",encoding="utf-8")
for i in range(5):
line = txt.readline()
print(line[:-1])
txt.close()
输出:
②
txt=open("中文网10.txt","r",encoding="utf-8")
for i in range(5):
line = txt.readline()
print(line)
txt.close()
输出:
3.用write写入文件的问题
初始时:
再写入一句话:
如图,用write会覆盖掉文件原本的内容
4.遍历文件简化模板
txt=open("中文网10.txt","r",encoding="utf-8")
for line in txt:
print(line)
txt.close()
(每行之间会有一个空行)
5.文件路径
- 如果需要处理文件路径,可以使用os.path模块中的对象和方
法;
▪ 如果需要使用命令行读取文件内容可以使用fileinput模块;
▪ 创建临时文件和文件夹可以使用tempfile模块;
▪ Python 3.4之后版本的pathlib模块提供了大量用于表示和处理
文件系统路径的类。
6.要及时关闭流
文件写入内容后,当前文件操作指针在写入内容的后面,不关闭流继续进行读文件的操作,会从当前写入的地方的指针开始向后读入并打印内容,但被写入内容却在指针前面。
解决方法:
在输出前插入seek(0)函数
txt=open("1.txt","w")
txt.writelines("["a","hh","zz"]")
txt.seek(0)
for line in txt:
print(line)
txt.close()
7.用文件画图
import turtle
turtle.title('动态路径绘制')
turtle.setup(800,600,0,0)
pen=turtle.Turtle()
pen.color("red")
pen.width(5)
pen.shape("turtle")
pen.speed(5)
result=[]
txt=open("1.txt","r",encoding="utf-8")
for line in txt:
result.append(list(map(float,line.split(','))))
for i in range (len(result)):
pen.color((result[i][3],result[i][4],result[i][5]))
pen.fd(result[i][0])
if result[i][1]:
pen.rt(result[i][2])
else:
pen.lt(result[i][2])
pen.goto(0,0)
txt.close()
1.txt中的内容
结果:
8.递归遍历文件夹
①深度优先搜索
from os import listdir
from os.path import join,isfile,isdir
def listDirDepth(directory):
for subpath in listdir(directory):
path=join(directory,subpath)
if isfile(path):
print(path)
elif isdir(path):
print(path)
listDirDepth(path)
wantpath="F:\za7za8\软件工程"#目标文件路径
listDirDepth(wantpath)
listdir()这个方法返回的是directory的列表,即该文件夹下文件的名称和类型,不包括完整路径,所以需要用到join,合成一个完整的绝对路径
isfile()这个方法的参数是一个绝对路径
②广度优先搜索
from os import listdir
from os.path import join,isfile,isdir
def listDirWidth(directory):
dirs=[directory]
while dirs:
current=dirs.pop(0)
for subpath in listdir(current):
path=join(current,subpath)
if isfile(path):
print(path)
elif isdir(path):
print(path)
dirs.append(path)
wantpath="F:\za7za8\online-test数据库文件"#目标路径
listDirWidth(wantpath)
dirs=[directory]表示的是当前目录下所有子文件/文件夹的列表(存疑)
9.找出当前目录下扩展名为xx的文件
import os
for fname in os.listdir(os.getcwd()):
if os.path.isfile(fname) and fname.endswith('.txt'):
print(fname)
os.getcwd()方法用于返回当前工作目录
拿扩展名为txt的文件举例
10.找出相似文本
以下代码是在一个txt文件中找出相似度大于90%的句子
import jieba
from difflib import SequenceMatcher
def fun1(txt):#相同的句子存放在vis中
vis = set()
for i in range(txt.__len__()):
flag = False
for j in range(i+1, txt.__len__()):
if txt[i] == txt[j]:
vis.add(txt[i])
for x in vis:
print(x)
def fun2(txt):#相似度90%以上的句子
vis = set()
for i in range(txt.__len__()):
flag = False
for j in range(i + 1, txt.__len__()):
if SequenceMatcher(None, txt[i], txt[j]).ratio() >= 0.9:
vis.add(txt[i])
for x in vis:
print(x)
file = open('中文网10.txt', 'r', encoding='utf-8-sig')
txt = []
try:
while True:
text_line = file.readline()
if text_line:
txt.append(text_line)
else:
break
finally:
file.close()
fun1(txt)
fun2(txt)
-
python官方库difflib的类SequenceMatcher 功能:比较文本的距离 ratio():
计算所有匹配片段的长度之和T,然后2*T/(len(a)+len(b)) 结果在[0,1],相同的时候返回1,没有相同片段返回0 -
encoding=‘utf-8-sig’: ”utf-8“
是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,因此它不需要BOM,所以当用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理,
也就会发生错误 “uft-8-sig"中sig全拼为 signature 也就是"带有签名的utf-8”,
因此"utf-8-sig"读取带有BOM的"utf-8文件时"会把BOM单独处理,与文本内容隔离开,也是我们期望的结果
记住,python中的len方法使用是txt.len()或者len(txt)
11.判断文件是否是GIF文件
def is_gif(fname):
with open(fname,'rb') as fp:
first4=fp.read(4)
return first4==b'GIF8'
print(is_gif("pyyy.py"))
这种方法比单纯判断后缀是否为gif更安全
12.用GUI写一个简单的登录页面
from graphics import *
import tkinter
def Submit():
s1=name.get()
s2=password.get()
if s1=='aaa'and s2=='111':
label["text"]="登录成功"
else:
label["text"] = "登录失败"
name.delete(0,'end')
password.delete(0,'end')
def close():
tk.destroy()
tk = tkinter.Tk()
tk.title("login")
tk.geometry("250x150")
label1 = tkinter.Label(tk,text='User Name:')
label2 = tkinter.Label(tk,text='User Psd:')
label = tkinter.Label(tk,text="")
button1 = tkinter.Button(tk,text='Login',command=Submit)
button2 = tkinter.Button(tk,text='Cancel',command=close)
name=tkinter.Entry(tk)
password=tkinter.Entry(tk)
label1.grid(row=1,column=1)
label2.grid(row=2,column=1)
label.grid(row=4,column=1)
button1.grid(row=3,column=1)
button2.grid(row=3,column=2)
name.grid(row=1,column=2)
password.grid(row=2,column=2)
tk.mainloop()
这里主要涉及到了python的系统自带布局,grid是流式布局;
Entry是可以改变文本内容的文本框
还有一种方法是