当前位置:首页 > Python教程 > python技巧

python(5)——文件操作

python文件操作

对文件的操作分三步:

1、打开文件获取文件的句柄,句柄就理解为这个文件

2、通过文件句柄操作文件

3、关闭文件。

 

            1 f=open(users.txt,r)  #打开文件, 默认为只读模式2 res = f.read()#读取文件内容3print(res)
4 f.close()#关闭文件

 

 

(一)打开文件

 

f=open(users.txt,r,encoding=utf-8)  #默认为只读模式 

    with使用:在操作文件的时候,经常忘了关闭文件,这样的就可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件,使用方式如下:

            1  with open(users.txt,r) as f:#打开一个文件,把这个文件的句柄付给f2for line in f:
3print(line)
45  with open(file.txt) as fr,with open(file_bak,w) as fw: #这个是多文件的操作,打开两个文件,fr是读file.txt,fw是新建一个file_bak文件6for line in fr:#循环file.txt中的每一行7                fw.write(line)#写到file_bak文件中

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,后面通过此文件句柄对该文件操作,

打开文件的模式:

            r 只读模式(默认),打开文件不存在的话,会报错
w 只写模式,不可读,不存在则创建,存在则会清空原来的文件内容
a 追加写模式,不可读,不存在则创建;存在则追加内容,不会清空原来的内容

r+ 读写模式  可读、可写,可追加,打开不存在的文件会报错
w+ 写读模式  使用w+,已经存在的文件内容会被清空,可读,但读的内容为空
a+ 追加读写模式  可读(注意读的时候先把文件指针移到文件头f.seek(0)),可写  不存在则创建,存在则只追加内容

"b"表示处理二进制文件(图片、歌曲、视频、压缩包....)
rb  wb ab 
rb+  wb+  ab+

 

(二) 读文件:三种方式 read()、 readlines()、 readline()

             1 f=open(users.txt,r,encoding=utf-8)  #默认为只读模式
2# read()一次读完文件所有内容,返回一个字符串 3print(第一次读:,f.read()) #获取到文件里面所有的内容,返回为字符串 4print(第二次读:,f.read()) #返回为空,读不到东西 因为第一次读完文件后指针移动到了文件末尾 若想第二次读,前面加f.seek(0) 5 6# readlines()获取到文件里面所有的内容,返回list,每一行内容为list的一个元素 7print(f.readlines()) # [‘123451234512345n‘, ‘heheheehn‘, ‘iesidfksfjasin‘, ‘oijeunlpihml‘] 8 9#readline()一次读一行,返回字符串10print(f.readline()) #12345123451234511print(f.readline()) #heheheeh

  大文件时,读取文件高效的操作方法:

用read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放

f=open(users.txt,encoding=utf-8)

# while True:
#     line=f.readline()
#     if line!=‘‘:
#         print(‘line:‘,line)
#     else:
#         print(‘文件内容读完了‘)
#         break#直接循环文件对象 ,不需要readfor line in f:
    print(line)

 

(三)写文件:两种方式 write()、 writelines()

写入字符串时用write(),写入list用writelines()
             1 f=open(users.txt,w,encoding=utf-8)  #默认为只读模式 2 users=[key1,123n,key2,456n,key3,789n]
 3#white() 入参为字符串,所以将一个列表写到文件中,若用write(),需循环取出每个元素再写 4for i in users:
 5    f.write(i)
 6 7#writelines()  入参为list ,所以可直接将list写到文件中 8f.writelines(users)

 

(四)修改文件内容

1、把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容;2、把修改后的文件内容写到一个新的文件中

             1
            #
            方法一:
             2
            #
             (1)先读到文件内容 --替换--只写方式再次打开文件(清空原来内容)---写入新的内容
             3
            #
            需两次打开文件
             4 f=open(file.txt,encoding=utf-8)
 5 res=f.read().replace(一点,二点) #文件读完后,指针在最后面 6f.close()
 7 f=open(file.txt,w,encoding=utf-8) #只写模式打开文件,写入时会清空原来的内容 8f.write(res)
 9f.close()
101112#(2)用truncate()方法清空文件内容  只需一次打开文件13 f=open(file.txt,a+,encoding=utf-8)
14f.seek(0)
15 res=f.read().replace(,you)
16 f.seek(0)    #read()之后,指针在文件末尾,需先移动指针到最前面17 f.truncate() #清空原来文件内容18f.write(res)
19 f.flush()  #不等缓冲区满,立即把内容写入磁盘20 f.close()
             1
            #
            方法二:打开两个文件--把源文件中的内容读出修改,写到新文件中---删除源文件--将新文件名字修改成源文件名字
             2
            #
             操作大文件时  一次操作一行
             3
            import
             os

             4 f=open(file.txt,encoding=utf-8)
 5 f2=open(file_bak.txt,w,encoding=utf-8)  #w 文件不存在会新建 6 7for line in f:  #循环取出原文件中每一行 8     new_line=line.replace(,me) #修改原文件 9     f2.write(new_line)  #写入新文件1011f.close()
12f2.close()
1314 os.remove(file.txt)  #删除原文件15 os.rename(file_bak.txt,file.txt) #将新文件名字修改成原文件名字1617#用with同时打开多个文件18 with open(file.txt) as fr,open(file_bak.txt,w) as fw:   #with会自动判断什么时候关闭文件  可同时打开多个文件19for line in fr:
20         new_line = line.replace(, me)
21        fw.write(new_line)
22 os.remove(file.txt)
23 os.rename(file_bak.txt,file.txt)

 

(五)文件操作练习:

             1
            #
            1.从日志里面找到1分钟之内访问超过200次的ip,加入黑名单
             2
            #
            2、每分钟都运行一次
             3
             4
            #
             1、读取文件内容,获取到ip地址
             5
            #
             2、把每个ip地址和出现的次数保存到字典中
             6
            #
             3、判断ip访问的次数是否超过200
             7
            #
             4、加入黑名单 print出来
             8
            #
             记住读到的位置,下次从这里开始读
             9
            10
            import
             time

            11 point=0   #文件指针初始位置12while True:
13     with open(access.log)as f:
14         f.seek(point)  #第一次循环时,从文件头开始读15         ip_all={}  #定义字典,保存出现的ip及其次数16for line in f: #循环取文件里面每行数据17             ip=line.split()[0] #按照空格分割,取第一个元素就是ip18if ip in ip_all:
19                 ip_all[ip]+=1
20else:
21                 ip_all[ip]=1
22     point=f.tell()  #记录本次读完后的指针位置  下次循环从这个位置开始读2324for ip,count in ip_all.items():
25if count>200:
26print(%s加入黑名单%ip)
27     time.sleep(60)   #定时运行  一分钟循环一次

 

原文:https://www.cnblogs.com/HathawayLee/p/9573657.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐