python3 使用注意

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是可以改变文本内容的文本框
还有一种方法是

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值