首页 > 代码库 > python之路----文件操作
python之路----文件操作
python文件操作
文件操作的基本流程:
1、打开文件f_read = open("filename",mode = ‘r‘,encoding="utf-8")
打开一个文件并且将文件句柄赋值给变量f_read,模式可以有多种,如:
r,只读模式(默认)。
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
r+,可读写文件。【可读;可写;可追加】
w+,写读
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
rb
wb
ab
文件句柄解释:在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。-----来自‘百度’
2、通过文件句柄f_read对文件进行操作
read([5]) 默认读取整个文件,加参数表示读取5个字节
readline() 默认读取一行,再运行一次readline()则读取下一行
readable() 判断文件是否可读,如果可读返回True,否则返回False
readlines() 把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。
write(str) 将str写到文件中,不会加换行符
writable() 判断文件是否可写,同readable
writelines(seq) 把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
flush() 把缓冲区的内容写入硬盘
tell() 以文件开头为原点,返回文件操作标记的当前位置
seek(offset[,whence]) 将文件的操作标记移动到offset的位置,whence=0时,表示从头开始,=1时表示以当前位置为原点,=2时表示以文件末尾为原点。需要注意:如果文件以a或者a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾
3、关闭文件
f_read.close() 即可
PS:一般用with open("filename",‘r+‘,encoding="utf-8") as f_read: 句式打开文件,这样等操作完成后python解释器会自动的关闭文件
以下自己实现了一个对文本文件的增、删、改、查的操作,小弟不才,实现的较为曲折,还请各位指出需要优化的地方
import os def operation(): #提供给用户的选择 oper_dict = {‘1‘:‘find‘,‘2‘:‘change‘,‘3‘:‘add‘,‘4‘:‘remove‘} for key in oper_dict: print(key,oper_dict[key]) select = input("请选择操作:").strip() if select == ‘1‘ or select == ‘find‘: find() if select == ‘2‘ or select == ‘change‘: change() if select == ‘3‘ or select == ‘add‘: add() if select == ‘4‘ or select == ‘remove‘: remove() def find(): out_flag = True #用来跳出外层循环的标志位 while out_flag: flag = False l = [] with open(‘haproxy.conf‘,‘r‘,encoding=‘utf-8‘) as f_read: #以读的方式打开文件 choice = input("请输入要查找的URL:").strip() for line in f_read: #遍历文件的每行并进行匹配 if line.startswith("backend") and choice in line: flag = True continue if line.startswith("backend") and flag: break if flag: l.append(line.strip()) #将匹配到的URL之中的记录存放到l中 for i in l: #输入结果 print(i) w = input("是否继续查询?y/n").strip() if w == ‘y‘ or w == ‘Y‘ or w == ‘yes‘: continue if w == ‘n‘ or w == ‘N‘ or w == ‘no‘: out_flag = False # os.rename("haproxy.conf","haproxy.conf.bak") #将原文件更名,并将修改后的文件重命名 # os.rename("test","haproxy.conf") #为了便于演示,这两行均没有运行 def change(): flag = False l = [] with open(‘haproxy.conf‘, ‘r‘, encoding=‘utf-8‘) as f_read,open(‘test‘,‘w‘,encoding=‘utf-8‘) as f_write: choice = input("请输入要更改的记录所属的URL:").strip() for line in f_read: #与查找功能一样 if line.startswith("backend") and choice in line: flag = True continue if line.startswith("backend") and flag: break if flag: l.append(line.strip()) count = 0 for i in l: print(count,i) count += 1 record = int(input("请输入要修改的记录编号:").strip()) new_record = input("请输入新记录:").strip() #将输入的新记录覆盖到之前查出的列表中 l[record] = new_record sign = False times = 0 with open(‘haproxy.conf‘, ‘r‘, encoding=‘utf-8‘) as f_read, open(‘test‘, ‘w‘, encoding=‘utf-8‘) as f_write: for line in f_read: if line.startswith("backend") and choice in line: sign = True f_write.write(line) continue if line.startswith("backend") and sign: sign = False f_write.write(line) continue if sign: if times < len(l): f_write.write(‘\t\t‘+l[times]+‘\n‘) #将修改后的列表以行的方式写到新文件中 times += 1 continue else: f_write.write(line) # os.rename("haproxy.conf","haproxy.conf.bak") # os.rename("test","haproxy.conf") def add(): flag = False l = [] with open(‘haproxy.conf‘, ‘r‘, encoding=‘utf-8‘) as f_read, open(‘test‘, ‘w‘, encoding=‘utf-8‘) as f_write: choice = input("请输入要添加的记录所属的URL:").strip() record = input("请输入要添加的记录:").strip() for line in f_read: if line.startswith("backend") and choice in line: flag = True f_write.write(line) f_write.write(‘\t\t‘+record+‘\n‘) #查询到需要添加的URL后,在下一行添加需要增加的行即可 continue if line.startswith("backend") and flag: flag = False f_write.write(line) continue if flag: f_write.write(line) continue else: f_write.write(line) # os.rename("haproxy.conf","haproxy.conf.bak") # os.rename("test","haproxy.conf") def remove(): flag = False l = [] with open(‘haproxy.conf‘, ‘r‘, encoding=‘utf-8‘) as f_read, open(‘test‘, ‘w‘, encoding=‘utf-8‘) as f_write: choice = input("请输入要删除的记录所属的URL:").strip() for line in f_read: if line.startswith("backend") and choice in line: flag = True continue if line.startswith("backend") and flag: break if flag: l.append(line.strip()) count = 0 for i in l: print(count, i) count += 1 record = int(input("请输入要删除的记录编号:").strip()) l.pop(record) sign = False times = 0 with open(‘haproxy.conf‘, ‘r‘, encoding=‘utf-8‘) as f_read, open(‘test‘, ‘w‘, encoding=‘utf-8‘) as f_write: for line in f_read: if line.startswith("backend") and choice in line: sign = True f_write.write(line) #没有进行修改的行正常写入 continue if line.startswith("backend") and sign: sign = False f_write.write(line) #没有进行修改的行正常写入 continue if sign: if times < len(l): f_write.write(‘\t\t‘ + l[times] + ‘\n‘) #将删除后的列表写到新文件里 times += 1 continue else: f_write.write(line) # os.rename("haproxy.conf","haproxy.conf.bak") # os.rename("test","haproxy.conf") operation()
python之路----文件操作