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数据后,将数据更新至配置文件中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/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')