python 之文件操作
一.文件基本操作
1.文件的打开
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作
文件句柄 = open('文件路径', '模式')
2.文件的读取
>>> f = open("f:/test.txt", "r") >>> f.read() 'hello,world' >>> f.close
3.打开文件的模式有:
- r ,只读模式【默认】
- w,只写模式【不可读;不存在则创建;存在则清空内容;】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
>>> f = open("f:/test.txt", 'r+') >>> f.read() 'heheo,world~~' >>> f.write("\naaaaaaa") 8 >>> f.tell() 22 >>> f.read() '' >>> f.tell() 22 >>> f.seek(0) 0 >>> f.read() 'heheo,world~~\naaaaaaa'
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
#以二进制文件写 f = open("file.txt", "wb") str_data = "呵呵" bytes_data = bytes(str_data, encoding='utf-8') f.write(bytes_data) f.close()
#以二进制文件读 f = open("file.txt",'rb') data = f.read() f.close() print(data) str_data = str(data,encoding="utf-8") print(str_data)
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型
4. r+, w+, x+, a+ 区别
r+ 可读,可写,若文件不存在会报错,根据指针位置可写随意位置
w+ 可写,可读,若文件不存在会创建,在进行写操作会清空文件内容
x+ 可写,可读,若文件存在会报错,不存在则创建
a+ 可写,可读,只能追加在文件尾部
5.文件内部支持操作:
readline() 逐行读取数据
#逐行去读,较省内存
f = open('log','r') result = list() for line in open('log'): line = f.readline() print(line) result.append(line) print(result) f.close()
trancate(),从文件的首行首字符开始截断,截断文件为n个字符;无n表示从当前位置起截断;截断之后n后面的所有字符被删除
>>> with open("f:/test.txt" , 'r+') as f: ... f.seek(2) ... f.truncate(3) ... 2 3 >>> with open("f:/test.txt" , 'r+') as f: ... f.read() ... 'hel'
read(),读取文件内容
>>> with open("f:/test.txt" , 'r+') as f: ... f.read() ... 'hel'
write(),写入内容
>>> with open("f:/test.txt" , 'r+') as f: ... f.read() ... f.write('llo' + '\n' + 'test') ... f.seek(0) ... f.read() ... 'hel' 8 0 'helllo\ntest'
readlines(), 将文件内容以列表的形式存放,---->[“第一行”, "第二行"]
>>> with open("f:/test.txt" , 'r+') as f: ... temp = f.readlines() ... print(temp) ... ['heheo,world~~\n', 'aaaaaaa']
open(),打开文件
>>> f = open('f:/test.txt', 'r')
close(),关闭文件
f.close()
flush(),强行刷入硬盘
tell() 获取指针位置
seek() 跳转到某个位置
二.管理上下文
为了避免打开文件后忘记关闭,可以通过管理上下文
with open("log", 'r+') as f: data = f.read() print(data)
三.练习
编写脚本实现 ,用户登录,注册,改密,删除功能
#!/usr/bin/env python # -*- coding:utf-8 -*- #删除用户,修改密码 def login(username, password): """ 用户登录验证 :param username: 用户名 :param password: 密码 :return: True成功,False失败 """ f = open('log', 'r', encoding='utf-8') for line in f: line = line.strip() userlist = line.split('$') if username == userlist[0] and password == userlist[1]: return True return False def user_ex(username): """ 用于检测用户是否存在 :param username: 用户名 :return: True 表示存在,False用户不存在 """ with open('log','r',encoding='utf-8') as f: for line in f: line = line.strip() userlist = line.split('$') if username in userlist: return True return False def res(username, password): """ 用于用户注册 :param username: 用户名 :param password: 密码 :return: True注册成功 """ with open('log','a',encoding='utf-8') as f: temp = "\n" + username + "$" + password f.write(temp) return True def change_pwd(username, password): """ 用户修改密码 :param username: 用户名 :param password: 修改后的密码 :return: True修改成功,False修改失败 """ file_object = open('log') try: lines=open('log','r').readlines() for i in range(len(lines)): if username in lines[i]: test=lines[i].split('$')[1] lines[i]=lines[i].replace(test,password) open('log','w').writelines(lines) return True return False finally: file_object.close( ) def del_user(username): """ 删除用户 :param username: 要删除用户名 :return: true 删除成功,False用户名不在列表中 """ file_object = open('log') try: lines = open('log', 'r').readlines() for i in range(len(lines)): if username in lines[i]: del lines[i] print(lines) open('log','w').writelines(lines) return True else: return False finally: file_object.close() # def del_user(username): # with open('log', 'r') as f: # for line in f: # if re.match("lisi", line): # pass # else: # data = line # with open('log', 'w+') as f: # f.write(data) # return True # return False def main(): inp = input("1:登录;2:注册;3:删除用户;4:修改密码") user = input("请输入用户名:") pwd = input("请输入密码:") if inp == "1": ret = login(user, pwd) if ret: print("登录成功") else: print("登录失败") elif inp == "2": is_ex = user_ex(user) if is_ex: print("用户已存在,无法注册") else: resgister = res(user, pwd) if resgister: print("用户已成功注册") else: print("注册失败") elif inp == "3": del_us = del_user(user) if del_us: print("已删除") else: print("无此用户") elif inp == "4": is_chage = change_pwd(user, pwd) if is_chage: print("修改成功") else: print("无此用户") main()
2.haproxy配置文件更改操作
需求:
1.匹配值 ,并将匹配到的内容以列表形式返回给用户
2.插入内容,用户input数据后,将数据更新至配置文件中
global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms option dontlognull listen stats :8888 stats enable stats uri /admin stats auth admin:1234 frontend oldboy.org bind 0.0.0.0:80 option httplog option httpclose option forwardfor log global acl www hdr_reg(host) -i www.oldboy.org use_backend www.oldboy.org if www backend www.oldboy.org server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000 backend buy.oldboy.org server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
#!/usr/bin/env python # -*- coding:utf-8 -*- def fetch(backend): result = [] with open('ha.conf', 'r') as f: flag = False for line in f: if line.strip().startswith('backend') and line.strip() == "backend " + backend: flag = True continue if flag and line.strip().startswith('backend'): break if flag and line.strip(): result.append(line.strip()) return result def add(backend, record): result = fetch(backend) if not result: # 无backend,无record pass else: # 有backend if record in result: # 记录record pass else: result.append(record) with open('ha.conf', 'r') as old, open('new.conf', 'w') as new: continue_flag = False for line in old: if line.strip().startswith('backend') and line.strip() == "backend " + backend: continue_flag = True new.write(line) for temp in result: new.write(" "*8 + temp + "\n") continue if continue_flag and line.strip().startswith('backend'): continue_flag = False if continue_flag: pass else: new.write(line) def add2(backend, record): with open('ha.conf', 'r') as old, open('new.conf', 'w') as new: in_backend = False has_backend = False has_record = False for line in old: if line.strip().startswith('backend') and line.strip() == "backend " + backend: has_backend = True in_backend = True new.write(line) continue if in_backend and line.strip().startswith('backend'): if not has_record: new.write(" "*8 + record + '\n') new.write(line) in_backend = False continue if in_backend and line.strip() == record: has_record = True new.write(line) continue if line.strip(): new.write(line) if not has_backend: # 写backend,写record new.write('backend '+ backend + '\n') new.write(' '*8 + record + '\n') # ret = fetch("www.oldboy.org") # print(ret) # add('www.oldboy.org', "server 100.1.7.10 100.1.7.10 weight 20 maxconn 3000") # add2('www.oldboy.org', "server 100.1.7.11 100.1.7.11 weight 20 maxconn 3000")
3. 号码段截取
需求:
将文件中的第二列前三字节和后四字节以逗号分开,文件格式如下:
1,"1300000","山东","济南","中国联通","0531","250000" 2,"1300001","江苏","常州","中国联通","0519","213000" 3,"1300002","安徽","巢湖","中国联通","0565","238000" 4,"1300003","四川","宜宾","中国联通","0831","644000" 5,"1300004","四川","自贡","中国联通","0813","643000"
需求目标:
1,"130","0000","山东","济南","中国联通","0531","250000"
代码实现:
def phone(): with open("mobile", "w+") as nf, open("Mobile.txt", "r") as f: for row in f: row = row.strip().split(',') row = (row[:1] + [row[1][:4]+'"', '"' + row[1][4:]] + row[2:]) nf.write(str(row).strip('[]').replace('" ', "")+'\n')