好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python学习之做一个文件增删改查小程序

import?os
import?re
from?typing?import?List
def?replace(a,a_swp):
????a_bak=a+'.bak'
????os.rename(a,a_bak)
????os.rename(a_swp,a)
????os.remove(a_bak)

def?fetch(domain):
????domain=domain
????if?not?domain:
????????domain=input('please?input?your?domain:').strip()
????result=[]
????with?open('remap.config','r')??as?read_f:
????????for?read_line?in?read_f:
????????????tmpdata=read_line.strip()
????????????if?re.search(domain,tmpdata)?:
????????????????result.append(tmpdata)
????????????????print(tmpdata)
????????????else:
????????????????continue
????????if?not?result:
????????????print("not?found")
????return?result
def?change():
????data=input('please?input?your?data:').strip()
????data_split=data.split()?#分割输入数据取domain,数据格式为map?http://domain?http://srcip?,则分割后取1下标的数据
????olddata=fetch(data_split[1])
????if?not?olddata:
????????with?open('remap.config',?'r')??as?read_f,open('remap.config.swp',?'w')??as?write_f:
????????????for?read_line?in?read_f:
????????????????write_f.write(read_line)
????????????write_f.write(data.strip('"')+'\n')
????else:
????????with?open('remap.config',?'r')??as?read_f,open('remap.config.swp',?'w')??as?write_f:
????????????for?read_line?in?read_f:
????????????????tmpdata?=?read_line.strip()
????????????????if?re.search(data_split[1],?tmpdata):
????????????????????write_f.write(data.strip('"')+'\n')
????????????????else:
????????????????????write_f.write(read_line)
????replace("remap.config","remap.config.swp")

def?add():
????data=input('please?input?your?data:').strip()
????with?open('remap.config',?'r')??as?read_f,?open('remap.config.swp',?'w')??as?write_f:
????????for?read_line?in?read_f:
????????????write_f.write(read_line)
????????write_f.write(data.strip('"')?+?'\n')
????replace("remap.config",?"remap.config.swp")
def?delete():
????data?=?input('please?input?your?data:').strip()
????olddata=fetch(data)
????if?olddata:
????????with?open('remap.config',?'r')??as?read_f,?open('remap.config.swp',?'w')??as?write_f:
????????????for?read_line?in?read_f:
????????????????tmpdata?=?read_line.strip()
????????????????if?re.search(data,?tmpdata):
????????????????????continue
????????????????else:
????????????????????write_f.write(read_line)
????????replace("remap.config",?"remap.config.swp")
????else:
????????print("needn't?delete")
list='''what?do?you?want??:
????1.fetch
????2.change
????3.add
????4.delete
????5.exit
'''
list_dic={
????1:fetch,
????2:change,
????3:add,
????4:delete,
????5:exit
}
while?True:
????print(list)
????choice=input('you?choice>>:?').strip()
????if?not?choice?or?not?choice.isdigit():
????????continue
????if?choice?==?'5':
????????break
????list_dic[int(choice)]()

如图:remap.config格式如下

map?http://baidu测试数据/?http://1.1.1.17/
map?http://HdhCmsTestbaidu测试数据/?http://1.1.1.17/
regex_map?http://[a-z0-9].baidu测试数据/?http://1.1.1.11/
map?http://285166825.cdn.baidu测试数据/?http://1.1.1.11/
map?http://1731178188.cdn.baidu测试数据/?http://1.1.1.11/
map?http://907607712.cdn.baidu测试数据/?http://1.1.1.11/
map?http://jmbaihacker.cdn.baidu测试数据/?http://1.1.1.11/
map?http://13991833.cdn.baidu测试数据/?http://1.1.1.11/
map?http://89802850.cdn.baidu测试数据/?http://1.1.1.11/
map?http://jbsdnsn.cdn.baidu测试数据/?http://1.1.1.11/
map?http://myl666.cdn.baidu测试数据/?http://1.1.1.11/
map?http://cdn-w.cdn.baidu测试数据/?http://1.1.1.11/

本程序意在熟悉python的函数、文件处理、控制模块功能

个人思路历程以及遇到的问题:

定义四个功能模块,add()等用pass占位

打印询问菜单,为了简洁用'''形式

用while true 循环,发现没退出功能,返回列表,增加一个退出选项5

用choice变量保存input输入的值,发现无法直接从原有询问列表list提取对应的操作选项,于是使用一个字典list_dic保存选项与操作的对应关系

发现用户可能不输入数字,于是用str.isdigit()判断客户输入,非数字则跳出本次循环

开始处理查询功能fetch,发现字符串匹配判断需要用到强大的re模块,此处我用

if?re.search(domain,tmpdata):

意为:如果domain在tmpdata中,则返回匹配对象,加上if则可判断对象是否存在,也就是有没有tmpdata里面有没有匹配到domain? ?更多参考:https://docs.python.org/zh-cn/3/library/re.html

处理change功能,发现必先查询,因为我这里默认限制修改功能数据格式为"map http://domain http://srcip“格式,而fetch功能默认只能查找domain,则对change功能的输入用str.split()进行分割提取domain,此处发现,input输入带空格的字符串必须用引号引起来,否则报错

对fetch功能进行修改:1.如果有参数值则查找的值(即data变量)为参数值,否则输入一个值? 2.构建一个空列表result,若查找到值,则用append()方法追加,最后return返回

文件写入时发现没换行,用+'\n'形式解决

write_f.write(data.strip('"')+'\n')

12.从change()功能模块中摘取对应功能代码略加修改生成add和delete模块

13.发现文件覆盖功能多次使用,提取出来做成replace函数调用

查看更多关于python学习之做一个文件增删改查小程序的详细内容...

  阅读:60次