一、文件I/O
1.1 读取CSV与遍历
- 导入csv库
- open文件
- 创建“表头”的tuple
- 使用csv.DictReader()函数
- 遍历使用for Name in,Name类型为OrderedDict,使用tuple元素作为下标访问
import csv
csvFile = open("test.csv", 'r', encoding = 'utf-8', errors = 'ignore')
# IO
fieldNames = ("城市", "环比", "同比", "定基")
# Tuple
csvRead = csv.DictReader(csvFile, fieldNames)
# DictReader,fieldNames省缺则以第一行为表头
for row in csvRead:
print(row['城市'])
# End for
值得注意的是,上述的遍历是从第0行开始的,即包含了文件本身的表头。若要消除文件自带表头,只需要在构造DictReader时省缺第二个参数。
1.2 csv转换json
- 导入csv与json库
- open文件
- 遍历csv,同时使用json.dump写入文件,同时使用write写入一个换行符
import csv
import json
csvFile = open("test.csv", 'r', encoding = 'utf-8', errors = 'ignore')
jsonFile = open("out.json", 'w', encoding = 'utf-8', errors = 'ignore')
fieldNames = ("城市", "环比", "同比", "定基")
csvRead = csv.DictReader(csvFile, fieldNames)
# fieldNames根据情况省略
for row in csvRead:
json.dump(row, jsonFile)
jsonFile.write('\n')
# End for
同样,上述代码中可能包含表头,解析时按行解析。
1.3 open的参数选择
def OpenFile(p_mode):
TxtFile = open("test.txt", p_mode, encoding="utf-8", errors="ignore")
return TxtFile
# End def
参数p_mode的选择:
- w:覆写
- r:读取
- a:附加
1.4 split()与IO的遍历
for row in testFile:
rowList = row.split()
# End for
在上述遍历中,testFile类型为IO,即直接使用open()打开的文件,row为string。此时对它按行遍历可以使用split()方法,返回list,其中添加需要的分割标识符即可,默认为空格。
二、正则表达式
首先导入re库。
if (re.match('^[-+]?[0-9]+\.[0-9]+$', TC_input)) :
print("输入错误,必须输入整数!")
F_ReInput = True
elif (re.match('^[-+]?[0-9]+', TC_input)) :
F_ReInput = False
F_Cancel = False
else :
print("输入格式错误,结束程序!")
F_Cancel = True
#End if
re.match()返回Ture|False,第一参数为正则表达式,第二参数为任意str。
三、显示输出
3.1 居中对齐
使用str.center()
for i in range(0, 10) :
Tri = '*' * (2 * i + 1)
# 第i行的*号
print(Tri.center(40, ' '))
#End for
str.center()第一参数为距离(字符数量),第二参数为填充字符。
3.2 ASCII字符转换
- ord(),ASCII字符->ASCII值
- chr(),ASCII值->ASCII字符
下面请看一段例题:凯撒密码,将字母顺移3个字符。
Ori = input('Input orignal string: \n')
# 输入
Ori = list(Ori)
IdxU = ord('A') + 23
IdxL = ord('a') + 23
#预处理
for i in range(len(Ori)) :
if ord(Ori[i]) / IdxU < 1 and int(ord(Ori[i])) in range(ord('A'), ord("Z") + 1):
Ori[i] = chr(ord(Ori[i]) + 3)
elif ord(Ori[i]) / IdxU >= 1 and ord(Ori[i]) in range(ord('A'), ord("Z") + 1):
Ori[i] = chr(ord(Ori[i]) - 23)
elif ord(Ori[i]) / IdxL < 1 and ord(Ori[i]) in range(ord('a'), ord("z") + 1):
Ori[i] = chr(ord(Ori[i]) + 3)
elif ord(Ori[i]) / IdxL >= 1 and ord(Ori[i]) in range(ord('a'), ord("z") + 1):
Ori[i] = chr(ord(Ori[i]) - 23)
else :
continue
#End if
#End for
print(Ori)
3.3 保留小数
·1:print(“%.2f” % a)
·2:round(a, 2)
a = 12.345
print("%.2f" % a)
print(round(a, 2))
这两种方法都是四舍五入的,若要使用去尾法或进一法则对其±”0.5″再四舍五入即可。
3.4 format
下面看一段代码(统计字符串类型)演示format的使用方法。
inStr = input('Input string\n')
numCh = 0
numNu = 0
numSp = 0
numOt = 0
# ans initialize
for i in range(len(inStr)) :
if ('a' <= inStr[i] and inStr <= 'z') or ('A' <= inStr[i] and inStr <= 'Z') :
numCh += 1
elif '0' <= inStr[i] and inStr <= '9' :
numNu += 1
elif inStr[i] == ' ' :
numSp += 1
else :
numOt += 1
# end if
# end for
print("ch : '{0}', nu : '{1}', sp : '{2}', ot : '{3}'".format(numCh, numNu, numSp, numOt))
三、数据结构
3.1 列表
- 声明:list = [ele, ele]
- 访问:list[idx],注意idx为int
下面通过for in range实现快速构造列表:
CodeList = []
for i in range(ord('a'), ord('z') + 1):
CodeList.append(chr(i))
# End for
- 排序:list.sort()
NumList.sort(reverse=True)
# 默认升序,reverse=Ture为降序
###########################################
# 获取列表的第二个元素
def takeSecond(elem):
return elem[1]
# End def
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 指定第二个元素排序
random.sort(key = takeSecond)
3.2 字典
- 构造:dict = {ele, ele}
- 访问:dict[idx],注意idx为ele.first元素类型
下面是一段演示:
NumDict = {1:"One", 2:"Two", 3:"Three", 4:"Four", 5:"Five", 6:"Six", 7:"Seven", 8:"Eight", 9:"Nine", 0:"Zero"}
inStr = input('input your phone num: ')
for i in range(len(inStr)):
if (i != len(inStr)):
print(NumDict[int(inStr[i])], end=' ')
else:
print(NumDict[int(inStr[i])], end='\n')
# End if
# End for
3.3 综合应用
下面是一个学生成绩表,求其综合成绩 = 期中0.5 + 期末0.5,并按综合成绩降序排序。
姓名,期中,期末
张三,69,95
李四,55,85
王五,79,85
宋海源,59,60
import csv
# 求综合成绩(0.5, 0.5),降序排序
# 读取文件
def OpenCsv(p_mode):
refile = open('score.csv', p_mode, encoding = 'utf-8', errors = 'ignore')
return refile
# End def
# 创建拷贝文件
def OpenCopy(p_mode):
refile = open('score_copy.csv', p_mode, encoding = 'utf-8', errors = 'ignore')
return refile
# End def
# 遍历求值,数据写入文件副本
def Taverser():
csvFile = OpenCsv('r')
csvRead = csv.DictReader(csvFile)
csvCopy = OpenCopy('w')
csvCopy = OpenCopy('a')
# 清空、加入
csvCopyHeader = ("姓名", "期中", "期末", "综合")
csvCopy.write("{0},{1},{2},{3}\n".format(csvCopyHeader[0], csvCopyHeader[1], csvCopyHeader[2], csvCopyHeader[3]))
for row in csvRead:
totalScore = (int(row["期中"]) * 0.5) + (int(row["期末"]) * 0.5)
csvCopy.write("{0},{1},{2},{3}\n".format(row["姓名"], row["期中"], row["期末"], totalScore))
# End for
# End def
# 获取tuple元素
def GetTotal(ele):
return float(ele[3])
# End def
# 排序
def CsvSort():
csvCopy = OpenCopy('r')
csvCopyRead = csv.DictReader(csvCopy)
CopyList = []
for row in csvCopyRead:
CopyList.append((row["姓名"], row["期中"], row["期末"], row["综合"]))
# End for
CopyList.sort(key = GetTotal, reverse = True)
return CopyList
# End def
# 覆写
def Overwrite():
TargetFile = OpenCsv('w')
TargetFile = OpenCsv('a')
CopyList = CsvSort()
csvCopyHeader = ("姓名", "期中", "期末", "综合")
TargetFile.write("{0},{1},{2},{3}\n".format(csvCopyHeader[0], csvCopyHeader[1], csvCopyHeader[2], csvCopyHeader[3]))
for ele in CopyList:
TargetFile.write("{0},{1},{2},{3}\n".format(ele[0], ele[1], ele[2], ele[3]))
# End for
# End def
def main():
Taverser()
Overwrite()
# End def
main()
四、jieba库
import jieba
def takeSecond(elem):
return elem[1]
# 主文本
path = "三国演义.txt"
file = open(path, "r", encoding="utf-8")
text = file.read()
file.close()
words = jieba.lcut(text)
counts = {}
# 单词统计
for word in words:
if len(word) == 1:
continue
elif ((word == "孔明") or (word == "孔明曰") or (word == "诸葛亮")):
reword = "诸葛亮"
elif ((word == "刘备") or (word == "玄德曰") or (word == "先主") or (word == "玄德")):
reword = "刘备"
elif ((word == "云长") or (word == "关羽") or (word == "关公")):
reword = "关羽"
elif ((word == "后主") or (word == "刘禅")):
reword == "刘禅"
else:
reword = word
# End if
counts[reword] = counts.get(reword, 0) + 1
# End for
# 排除项
excludes = {"将军", "却说", "丞相", "二人", "不可", "荆州", "不能", "如此",
"商议", "主公", "如何", "军士", "左右", "军马", "引兵", "大喜", "次日", "天下",
"东吴", "于是", "今日", "不敢", "魏兵", "一人", "都督", "人马", "陛下", "不知",
"汉中", "只见", "众将", "上马", "大叫", "蜀兵", "太守", "此人", "夫人", "后人",
"天子", "一面", "何不", "大军", "忽报", "背后", "城中", "先生", "何故", "百姓",
"然后", "先锋", "不如", "赶来", "令人", "成都", "原来", "江东", "下马", "正是",
"忽然", "喊声", "徐州", "因此", "不见", "未知", "大败", "大事", "之后", "引兵",
"起兵", "军中", "一军", "引军", "接应", "进兵", "大惊", "可以", "以为", "大怒",
"不得", "心中", "下文", "一声", "追赶", "粮草", "曹兵", "回报", "分解", "一齐"}
for delWord in excludes:
try:
del counts[delWord]
except:
continue
# End try
# End for
# 统计
items = list(counts.items())
items.sort(key = takeSecond, reverse=True)
for i in range(20):
item = items[i]
keyWord = item[0]
count = item[1]
print("{0:<10}{1:>5}".format(keyWord, count))
# End for
五、图形界面
import tkinter as tk
import tkinter.messagebox
########## Section 00 : Function ##########
# 打开密码文件
def OpenFile(p_mode):
TxtFile = open("pwd.txt", p_mode, encoding="utf-8", errors="ignore")
return TxtFile
# End def
# 查询以存在用户及其密码
def SearchUser(p_user, p_pwd):
Ruser = False
Rpwd = False
# return value 用户是否存在、密码是否错误
pwdFile = OpenFile('r')
# 打开文件
# Search
for row in pwdFile:
rowList = row.split()
if (rowList[0] == p_user):
Ruser = True
if (rowList[1] == p_pwd):
Rpwd = True
break
# End if
# End if
# End for
return [Ruser, Rpwd]
# End def
# 写入密码
def SetUser(p_user, p_pwd):
pwdFile = OpenFile('a')
pwdFile.write(p_user + " " + p_pwd + "\n")
# End def
# 登录函数
def Login(p_user, p_pwd):
re = True
searchAns = SearchUser(p_user, p_pwd)
if (searchAns[0] == False):
tk.messagebox.showerror(title = 'Error', message = 'User no Exists')
re = False
elif (searchAns[1] == False):
tk.messagebox.showerror(title = 'Error', message = 'Wrong password')
re = False
else:
tk.messagebox.showinfo(title = 'Success', message = 'Login Success')
# End if
return re
# End def
def Registe(p_a, p_b):
SetUser(p_a, p_b)
# 抛出Message
tk.messagebox.showinfo(title = 'Registe', message = 'Registe Success')
# End def
# 注册函数
def Register():
rWin = tk.Tk()
# 注册窗口
rWin.title("Registe")
rWin.geometry("300x300")
# 注册Entry
rEntryU = tk.Entry(rWin, show = None)
rEntryP = tk.Entry(rWin, show = '*')
rEntryU.pack()
rEntryP.pack()
# 注册按钮
rButton = tk.Button(rWin, text = 'Registe', command = lambda: Registe(rEntryU.get(), rEntryP.get()))
rButton.pack()
# 窗口循环
rWin.mainloop()
# End def
########## Section 00 : Window ##########
def Win():
mainWin = tk.Tk()
# 主窗口
mainWin.title("Login")
mainWin.geometry('500x500')
# 用户名与密码的输入
mainEntryU = tk.Entry(mainWin, show = None)
mainEntryP = tk.Entry(mainWin, show = '*')
mainEntryU.pack()
mainEntryP.pack()
# 登录与注册按钮
mainButtonL = tk.Button(mainWin, text = 'Login', command = lambda: Login(mainEntryU.get(), mainEntryP.get()))
mainButtonR = tk.Button(mainWin, text = 'Registe', command = Register)
mainButtonL.pack()
mainButtonR.pack()
mainWin.mainloop()
# End def
def main():
Win()
# End def
main()
Comments | NOTHING