当前位置:Gxlcms > 数据库问题 > Python 模拟SQL对文件进行增删改查

Python 模拟SQL对文件进行增删改查

时间:2021-07-01 10:21:17 帮助过:6人阅读

#!/usr/bin/env python 2 # _*_ coding:UTF-8 _*_ 3 # __auth__: Dalhhin 4 # Python 3.5.2,Pycharm 2016.3.2 5 # 2017/05/15 6 7 import sys,os 8 9 def where(dbfile,where_list): #条件是一个list 10 11 def and_or_where(sub_where_list): 12 ‘‘‘获取and或同时含有and、or关键字的条件‘‘‘ 13 and_list = [] 14 or_list = [] 15 for i in sub_where_list: 16 if i == and: 17 and_index = sub_where_list.index(i) 18 and_list_temp1 = sub_where_list[:and_index] 19 and_list_temp2 = sub_where_list[and_index + 1:] 20 if or in and_list_temp1: 21 and_list.append(and_list_temp2) 22 or_index = and_list_temp1.index(or) 23 or_list.append(and_list_temp1[:or_index]) 24 and_list.append(and_list_temp1[or_index + 1:]) 25 break 26 if or in and_list_temp2: 27 and_list.append(and_list_temp1) 28 or_index = and_list_temp2.index(or) 29 and_list.append(and_list_temp2[:or_index]) 30 or_list.append(and_list_temp2[or_index + 1:]) 31 break 32 and_list.append(and_list_temp1) 33 and_list.append(and_list_temp2) 34 return and_list,or_list 35 36 def or_where(sub_where_list): 37 ‘‘‘获取只有or条件下的关键字条件‘‘‘ 38 if len(sub_where_list) > 4: 39 or_list = [] 40 or_str_temp1 = .join(sub_where_list) 41 or_list_temp2 = or_str_temp1.split(or) 42 for or_info in or_list_temp2: 43 or_list.append(or_info.split()) 44 return or,or_list 45 else: 46 return or,sub_where_list 47 48 def and_where(sub_where_list): 49 ‘‘‘获取只有and条件下的关键字条件‘‘‘ 50 and_list = [] 51 and_str = .join(sub_where_list) 52 and_list_temp = and_str.split(and) 53 for and_info in and_list_temp: 54 and_list.append(and_info.split()) 55 return and,and_list 56 57 def not_and_or_where(sub_where_list): 58 ‘‘‘获取无and和or关键字的时候的条件‘‘‘ 59 par_list = [] 60 par_list.append(sub_where_list) 61 return None,par_list 62 63 def not_and_or_data(where_list): 64 ‘‘‘获取没有and和or条件时匹配到的数据‘‘‘ 65 where_tiaojian = not_and_or_where(where_list) # 交给函数处理,得到处理后的 条件元组 66 if not not in where_tiaojian[1][0]: # 当条件没有not关键字的时候 67 field_name, mark, value = where_tiaojian[1][0] # 不取反那么就获取条件的字段,运算符,值 68 match_data = [] # 用于存放匹配的数据,最后进行展示 69 with open(dbfile, encoding=UTF-8) as fd: 70 for user_info in fd: 71 user_id, user_name, user_age, user_phone, user_job, user_date = user_info.strip().split(,) 72 if field_name == id: # 读取文件的每一行,判断条件的字段是否是id 73 if mark != =: # 不取反 74 if eval(%s %s %s % (user_id, mark, value)): # 针对条件字段,进行数据的过滤 75 match_data.append(user_info) # 存储匹配的数据 76 continue 77 else: 78 if user_id == value: 79 match_data.append(user_info) 80 continue 81 elif field_name == age: 82 if mark != =: 83 if eval(%s %s %s % (user_age, mark, value)): 84 match_data.append(user_info) 85 continue 86 else: 87 if user_age == value: 88 match_data.append(user_info) 89 continue 90 else: 91 print(条件仅支持对id,age字段进行过滤!) 92 break 93 return match_data 94 else: # 当关键字有not的时候,对数据进行取反 95 not_str, field_name, mark, value = where_tiaojian[1][0] 96 match_data = [] 97 with open(dbfile, encoding=UTF-8) as fd: 98 for user_info in fd: 99 user_id, user_name, user_age, user_phone, user_job, user_date = user_info.strip().split(,) 100 if field_name == id: 101 if mark != =: 102 if eval(%s %s %s % (user_id, mark, value)): 103 match_data.append(user_info) 104 continue 105 else: 106 if user_id == value: 107 match_data.append(user_info) 108 continue 109 elif field_name == age: 110 if mark != =: 111 if eval(%s %s %s % (user_age, mark, value)): 112 match_data.append(user_info) 113 continue 114 else: 115 if user_age == value: 116 match_data.append(user_info) 117 continue 118 else: 119 print(条件仅支持对id,age字段进行过滤!) 120 break 121 with open(dbfile, encoding=UTF-8) as old_fd: 122 data = old_fd.readlines() 123 data = set(data) 124 match_data = set(match_data) # 利用set求出not的集合,逻辑是先取出所有的数据,然后取出非not的匹配的数据,然后求差集 125 match_data_not = data.difference(match_data) 126 match_data_not = list(match_data_not) 127 match_data_not.sort() 128 return match_data_not 129 130 def or_data(where_list): 131 ‘‘‘获取or条件下匹配到的数据‘‘‘ 132 if len(where_list) > 4: 133 where_tiaojian = or_where(where_list) 134 match_data_list = [] 135 for or_where_list in where_tiaojian[1]: 136 field_name, mark, value = or_where_list 137 with open(dbfile, encoding=UTF-8) as fd: 138 for user_info in fd: 139 user_id, user_name, user_age, user_phone, user_job, user_date = user_info.strip().split( 140 ,) 141 if field_name == id: 142 if mark != =: 143 if eval(%s %s %s % (user_id, mark, value)): 144 match_data_list.append(user_info) 145 continue 146 else: 147 if user_id == value: 148 match_data_list.append(user_info) 149 continue 150 elif field_name == age: 151 if mark != =: 152 if eval(%s %s %s % (user_age, mark, value)): 153 match_data_list.append(user_info) 154 continue 155 else: 156 if user_age == value: 157 match_data_list.append(user_info) 158 continue 159 else: 160 print(条件仅支持对id,age字段进行过滤!) 161 break 162 match_data_set = set(match_data_list) 163 match_data_list = list(match_data_set) 164 match_data_list.sort() 165 return match_data_list 166 else: 167 where_tiaojian = or_where(where_list) 168 or_where_list = where_tiaojian[1][0] 169 match_data_list = [] 170 field_name, mark, value = or_where_list 171 with open(dbfile, encoding=UTF-8) as fd: 172 for user_info in fd: 173 user_id, user_name, user_age, user_phone, user_job, user_date = user_info.strip().split(,) 174 if field_name == id: 175 if mark != =: 176 if eval(%s %s %s % (user_id, mark, value)): 177 match_data_list.append(user_info) 178 continue 179 else: 180 if user_id == value: 181 match_data_list.append(user_info) 182 continue 183 elif field_name == age: 184 if mark != =: 185 if eval(%s %s %s % (user_age, mark, value)): 186 match_data_list.append(user_info) 187 continue 188 else: 189 if user_age == value: 190 match_data_list.append(user_info) 191 continue 192 else: 193 print(条件仅支持对id,age字段进行过滤!) 194 break 195 return match_data_list 196 197 def and_data(where_list): 198 ‘‘‘获取and条件下匹配到的数据‘‘‘ 199 where_tiaojian = and_where(where_list) 200 with open(dbfile, encoding=UTF-8) as fd: 201 match_data = fd.readlines() 202 match_data_set = set(match_data) # 获取所有数据 203 for and_where_list in where_tiaojian[1]: 204 match_data_list = [] 205 field_name, mark, value = and_where_list 206 with open(dbfile, encoding=UTF-8) as fd: 207 for user_info in fd: 208 user_id, user_name, user_age, user_phone, user_job, user_date = user_info.strip().split(,) 209 if field_name == id: 210 if mark != =: 211 if eval(%s %s %s % (user_id, mark, value)): 212 match_data_list.append(user_info) 213 continue 214 else: 215 if user_id == value: 216 match_data_list.append(user_info) 217 continue 218 elif field_name == age: 219 if mark != =: 220 if eval(%s %s %s % (user_age, mark, value)): 221 match_data_list.append(user_info) 222 continue 223 else: 224 if user_age == value: 225 match_data_list.append(user_info) 226 continue 227 else: 228 print(条件仅支持对id,age字段进行过滤!) 229 break 230 match_data_temp = set(match_data_list) 231 match_data_set = match_data_set.intersection(match_data_temp) # 每次循环利用集合的并集来求出and的语句 232 match_data = list(match_data_set) 233 match_data.sort() # 排序 234 return match_data 235 236 #对条件进行and,or,not,等情况的综合判断,不同的条件组合调用不同的函数组合 237 if where in where_list: #首先判断带where关键字的条件 238 where_list.remove(where) 239 if like in where_list: #对like关键字进行判断 240 data = [] 241 field, _, value = where_list 242 with open(dbfile, encoding=utf-8) as fd: 243 context = fd.readlines() 244 for ele in context: 245 _,name,_,_,_,_ = ele.split(,) 246 if name.find(value) != -1: 247 data.append(ele) 248 return data 249 elif and in where_list and or in where_list: #对and和or条件同时存在时进行判断 250 and_list, or_list = and_or_where(where_list) 251 and_where_str = ‘‘ 252 for and_info in and_list: 253 and_str = .join(and_info) 254 and_where_str += + and_str + + and 255 if and_where_str.endswith(and): 256 and_list = and_where_str.split()[:-1] 257 and_data_list = and_data(and_list) 258 or_data_list = or_data(or_list) 259 and_data_set = set(and_data_list) 260 or_data_set = set(or_data_list) 261 show_data = and_data_set.union(or_data_set) 262 return show_data 263 elif and not in where_list and or not in where_list: # 不包含and和or关键字的条件 264 data = not_and_or_data(where_list) 265 return data 266 elif or in where_list and and not in where_list: # 仅包含or的条件 267 data = or_data(where_list) 268 return data 269 elif and in where_list and or not in where_list: #仅有and关键字的时候的条件 270 data = and_data(where_list) 271 return data 272 273 elif limit in where_list: #对limit条件进行判断 274 limits = where_list[-1] 275 data = [] 276 with open(dbfile,encoding=UTF-8) as fd: 277 context = fd.readlines() 278 for i in range(int(limits)): 279 data.append(context[i]) 280 return data 281 282 #增删改查逻辑处理 283 def insert(sqlcmd): 284 ‘‘‘插入操作‘‘‘ 285 try: 286 cmd = sqlcmd.strip().split() #获取输入字符的list形式 287 # print(cmd) 288 into = cmd[1] #SQL关键字 289 dbfile = cmd[2].replace(.,/) #目标库/表文件 290 command = cmd[3] #SQL关键字 291 values = cmd[4] #插入的数据 292 if not into == into or not command == values: #语法关键字判断 293 print(Syntax error,Please check) 294 else: 295 with open(dbfile,encoding=UTF-8) as fd: #读取目前文件的ID 296 old_id = len(fd.readlines()) 297 with open(dbfile,a+,encoding=UTF-8) as fd: #拼成目标字符串然后追加至文件末尾 298 id = ( old_id + 1 ) 299 name,age,phone,job,sqltime = values.split(,) 300 info = [{}.format(id),{}.format(name),{}.format(age),{}.format(phone),{}.format(job),{}.format(sqltime)] 301 info = ,.join(info) 302 fd.write(\n{}.format(info)) 303 print("insert [ {} ] Successful!".format(info)) 304 except (IndexError,ValueError) : #当插入的数据不满足需求,则进行异常抓取并提示 305 print(缺少数据:请按照如下格式插入:insert into table values 姓名,年龄,电话,工作,时间\n.expandtabs(20)) 306 except FileNotFoundError: #当表不存在时,则进行异常抓取并提示 307 print(插入的数据库或表不存在,请检查!) 308 309 def delete(sqlcmd): 310 ‘‘‘删除操作‘‘‘ 311 sql, where_list = sqlcmd.split()[:3], sqlcmd.split()[3:] 312 _, mark, dbfile = sql 313 if where_list: 314 if dbfile.find(.) == -1: # 判断数据库和表之间的分隔符是否是. 315 print(库名和表明之间请使用.分隔!) 316 else: 317 dbfile = dbfile.replace(., /) # 修改表名的故事 db1/emp 318 data = where(dbfile, where_list) 319 with open(dbfile,encoding=utf-8) as fd: 320 old_data = fd.readlines() 321 with open(dbfile,w,encoding=UTF-8) as fd : 322 for not_del in old_data: 323 if not_del in data: 324 continue 325 else: 326 fd.write(not_del) 327 else: 328 print(不允许不加条件的删除操作!) 329 330 def update(sqlcmd): 331 ‘‘‘更新操作‘‘‘ 332 sql,where_list = sqlcmd.split()[:6],sqlcmd.split()[6:] 333 _,dbfile,key,field,mark,value = sql 334 if where_list: 335 if dbfile.find(.) == -1: # 判断数据库和表之间的分隔符是否是. 336 print(库名和表明之间请使用.分隔!) 337 else: 338 dbfile = dbfile.replace(., /) # 修改表名的故事 db1/emp 339 data = where(dbfile,where_list) 340 id,name,age,phone,job,date = data[0].split(,) 341 update_data = data[0].replace(name,value) 342 with open(dbfile,encoding=utf-8) as fd: 343 old_data = fd.readlines() 344 with open({}.swap.format(dbfile),w,encoding=UTF-8) as fd : 345 for new_data in old_data: 346 if new_data == data[0]: 347 write_data = update_data 348 else: 349 write_data = new_data 350 fd.write(write_data) 351 os.remove(dbfile) 352 os.rename({}.swap.format(dbfile), dbfile) 353 354 def select(sqlcmd): 355 sql,where_list = sqlcmd.split()[:4],sqlcmd.split()[4:] 356 _,field,mark,dbfile = sql 357

人气教程排行