一.文件基本操作
1.文件的打开
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作
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'
80'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 -*-#删除用户,修改密码
deflogin(username, password):"""用户登录验证
:param username: 用户名
:param password: 密码
:return: True成功,False失败"""f= open('log', 'r', encoding='utf-8')for line inf:
line=line.strip()
userlist= line.split('$')if username == userlist[0] and password == userlist[1]:returnTruereturnFalsedefuser_ex(username):"""用于检测用户是否存在
:param username: 用户名
:return: True 表示存在,False用户不存在"""with open('log','r',encoding='utf-8') as f:for line inf:
line=line.strip()
userlist= line.split('$')if username inuserlist:returnTruereturnFalsedefres(username, password):"""用于用户注册
:param username: 用户名
:param password: 密码
:return: True注册成功"""with open('log','a',encoding='utf-8') as f:
temp= "\n" + username + "$" +password
f.write(temp)returnTruedefchange_pwd(username, password):"""用户修改密码
:param username: 用户名
:param password: 修改后的密码
:return: True修改成功,False修改失败"""file_object= open('log')try:
lines=open('log','r').readlines()for i inrange(len(lines)):if username inlines[i]:
test=lines[i].split('$')[1]
lines[i]=lines[i].replace(test,password)
open('log','w').writelines(lines)returnTruereturnFalsefinally:
file_object.close( )defdel_user(username):"""删除用户
:param username: 要删除用户名
:return: true 删除成功,False用户名不在列表中"""file_object= open('log')try:
lines= open('log', 'r').readlines()for i inrange(len(lines)):if username inlines[i]:dellines[i]print(lines)
open('log','w').writelines(lines)returnTrueelse:returnFalsefinally:
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
defmain():
inp= input("1:登录;2:注册;3:删除用户;4:修改密码")
user= input("请输入用户名:")
pwd= input("请输入密码:")if inp == "1":
ret=login(user, pwd)ifret:print("登录成功")else:print("登录失败")elif inp == "2":
is_ex=user_ex(user)ifis_ex:print("用户已存在,无法注册")else:
resgister=res(user, pwd)ifresgister:print("用户已成功注册")else:print("注册失败")elif inp == "3":
del_us=del_user(user)ifdel_us:print("已删除")else:print("无此用户")elif inp == "4":
is_chage=change_pwd(user, pwd)ifis_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 -*-
deffetch(backend):
result=[]
with open('ha.conf', 'r') as f:
flag=Falsefor line inf:if line.strip().startswith('backend') and line.strip() == "backend" +backend:
flag=Truecontinue
if flag and line.strip().startswith('backend'):break
if flag andline.strip():
result.append(line.strip())returnresultdefadd(backend, record):
result=fetch(backend)if notresult:#无backend,无record
pass
else:#有backend
if record inresult:#记录record
pass
else:
result.append(record)
with open('ha.conf', 'r') as old, open('new.conf', 'w') as new:
continue_flag=Falsefor line inold:if line.strip().startswith('backend') and line.strip() == "backend" +backend:
continue_flag=True
new.write(line)for temp inresult:
new.write(" "*8 + temp + "\n")continue
if continue_flag and line.strip().startswith('backend'):
continue_flag=Falseifcontinue_flag:pass
else:
new.write(line)defadd2(backend, record):
with open('ha.conf', 'r') as old, open('new.conf', 'w') as new:
in_backend=False
has_backend=False
has_record=Falsefor line inold: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 nothas_record:
new.write(" "*8 + record + '\n')
new.write(line)
in_backend=Falsecontinue
if in_backend and line.strip() ==record:
has_record=True
new.write(line)continue
ifline.strip():
new.write(line)if nothas_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")
View Code
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')