Python:文件操作、读写

打开文件的模式:

w写模式、不能读,如果用w模式打开已经有内容的文件,会清空以前的文件内容,重新写内容;

r读模式、不能写、文件必须先存在;
a追加模式、只能写、不能读,在原文件内容的末尾追加内容。例如:f=open(‘a.txt’,’w’,encoding=’utf-8’)#加不加utf-8视情况而定,
f代表的是文件的对象,叫句柄,文件对象是可迭代的(可循环)
f=open(‘a.txt’,’w+’,encoding=’utf-8’)#w+是读写模式,也会清空以前的内容,沾上w原文件内容肯定会清空
f=open(‘a.txt’,’r+’,encoding=’utf-8’)#写读模式,只要沾上r,文件必须得先存在
f=open(‘a.txt’) #默认是r模式
f=open(‘a.txt’,‘a+’)#用a+模式,能读能写,文件不存在时也不会报错,也不会清空原文件内容,但读文件时指针在文件末尾,所以读不出来
rb+ wb+ ab+ #这种是二进制模式打开或读写,一些音乐文件、图片需要,纯文本不需要b

文件指针:

f.seak(0)#文件指针移到最前面

读写文件:

f.read(num)
默认读取整个文件,num可以设置设取的数据的大小(英文字符个数)
f.readlines(num)
默认读取整个文件,并以行为分隔符,返回值是一个列表,每行为一个元素
f.readline(num)
每次运行读取一行,最节省空间
f.write(str)
向文件写入数据,str必须是字符串类型。
f.tell()
显示当前指针位置,循环文件时不能使用tell(),必须得文件全部循环结束后才能使用tell(),循环时使用会报错

f.seek(num)
设置指针位置,f.seek(0)文件开始,
f.flush()
强制把内存数据写入到文件。默认程序运行结束才写入
next(f)
逐行读取文件,f是打开的文件对象,不能与tell()同时用,一般迭代器用

 

f.truncate() #清空文件内容

f.close()  #关闭文件

 

import os # 引用os模块

os.remove('a.txt') #删除文件

os.raname('a.txt1','a,txt') #给文件重命名

 

flush用法:

f.flush()  #给文件写完内容之后,立马生效

 

with用法:

with open('a,txt') as fr:  #文件不再使用的时候,除了with模块时,with会自动关闭文件,as在这里定义一个变量名

with open('a,txt') as fr,open('b.txt','a+') as fa #打开多个文件

补充:with的用法
# 可以自动管理上下文用
# 1:在操作文件中使用,出了with,文件自动关闭
# 2:在操作数据库中用

 

修改文件:

方式一:获取到文件里的内容,然后修改内容,清空原来文件的内容,把新内容写入文件
f.truncate() 清空文件内容
方式二:高效的方式:
1。先打开原来的文件,再打开一个空文件
2。循环处理原来文件的每一行数据,处理完之后,写到新文件里
3。把原来文件删除,新文件命名为原来的名字
import os
with open('words',encoding='utf-8') as fr,open('.words','w',encoding='utf-8') as fw:
  for line in fr:
  line=line.lstrip() #修改原来文件,删掉每一行左边的空格
  line=line.replace('你','you') #修改原来文件,把"你"改成you
  fw.write(line) #修改过的数据写入到新文件里
  os.remove('words') #删除原来的文件
  os.rename('.words','words) #把新文件命名为原来文件的名字

例子:监控日志:

import time
point=0
while 1: #死循环,一直监控
  with open('access.log',encoding='utf-8') as fr:
    fr.seek(point)
    ip_dic={} #一个字段,存放出现的ip和出现的次数
    for line in fr:
      ip=line.split()[0] #分割后得到的时ip
      if ip in ip_dic:
        ip_dic[ip]+=1 #出现过的ip次数加1
      else:
        ip_dic[ip]=1 #未出现过的ip次数是1
    point=fr.tell() #打印出当前的指针
  for k in ip_dic:
    if ip_dic[k]>=100: #次数>=100
      print('该ip%s正在攻击你的电脑'%k)
  time.sleep(60) #等新日志一分钟,再监控新的日志

 补充:

exit() #结束并退出

{

python xxx.py a.txt niuhanyang hehe  #用python命令在命令行里运行,传入参数

import sys

print(sys.argv) #用来获取在用python命令运行python文件的时候传入的参数

}

 

posted @ 2017-06-09 21:46  hesperid  阅读(198)  评论(0编辑  收藏  举报