测开2 - Python(文件操作)

把第一次写好漏掉的点写在最前面:文件读写的内容都要求是字符串。

几种文件操作的模式:

1. 'r',读模式(默认模式),只能读不能写,文件不存在时报错

2. 'w',写模式,只能写不能读,文件不存在时会创建,但是存在时会先清空原文件内容

3. 'a',追加模式,增加新内容,不存在时会创建,但不能读

4. 'r+',读写模式,能写能读,但文件不存在时会报错

5. 'w+',写读模式,能读能写,文件不存在会创建,但文件存在时会先清空原文件内容

6. 'a+',追加读模式,啥都能(能写,即追加新内容,不存在会创建,能读,不影响原内容)

总之,只要 r 相关的,不存在时都报错,w 相关的,都会清空原文件内容,运用时可根据实际情况选择模式。日常操作就是读写操作配合合适的模式。

 一、读

read(): 一次性获取文件内容,返回值为 string

1 f = open('test.txt',encoding='utf-8')
2 result = f.read()    #获取文件内容,read()方法一次性读取所有内容
3 print(result)
4 
5 f.close()

readline(): 读取一行

readlines(): 一次性读取,并把文件内容存到 list 中,一行为一个元素

1 f = open('jlf.txt',encoding='utf-8')
2 result = f.readlines()
3 print(result)  #结果:['a\n', 'b\n', 'c\n', 'd\n', 'e\n', 'f'],如果要去掉'\n',则需要用 strip() 方法
4 
5 f.close()    

 

二、写

write:直接写内容

writelines:循环把内容写进文件,对象可以是字符串、列表,只要是能循环的都可以。

1 s='sdfasdf'
2 f = open('jlf.txt','w',encoding='utf-8')
3 
4 # for i in s:
5 #     f.write(i)
6 f.writelines(s)     #把 list 的内容循环写进文件,与上一个注释掉的方法效果相同
7 f.close()

 

三、文件指针

是用来指示文件操作的位置。读模式下,指针在最前;写模式下,因为会清空内容,所以也算是在前面;追加模式下,指针在最后。

 

四、文件中的其他方法(除了上面说过的读和写)

1     f = open('jlf.txt','r+',encoding='utf-8')#encoding参数可以指定文件的编码
2     f.readable()#判断文件是否可读
3     f.writable()#判断文件是否可写
4     f.tell()#获取当前文件的指针指向
5     f.seek(0)#把当前文件指针指向最前面
6     f.fulsh()#写入文件后,立即从内存中把数据写到磁盘中
7     f.truncate()#清空文件内容
8     f.writelines(['1','2'])#将一个列表写入文件中
9     f.close()关闭文件

 

五、几种高效的操作

1. 不用关闭文件的方式

为防止每次打开文件使用之后忘记关闭,有这样一种方法,可以在你代码运行完之后自动关闭文件,如下

1 with open('jlf.txt',encoding='utf-8') as f1,open('abc.txt','w',encoding='utf-8') as f2:
2     content = f1.read()
3     f2.write(content)
4     print(content)

2. 高效处理文件

在读取文件内容的时候,如果用 read 或者 readlines,都会直接把所有内容读取到内存,文件较大时可能直接导致内存不够用机器卡死,所以这里给出一种比较高效的方式

1 with open('access.log',encoding='utf-8') as f:
2     for line in f:            #直接循环文件,一次读一行
3         print('每次:',line)

 

六、修改文件

 1. 第一种属于简单直接粗暴的方式,适合小文件的处理,步骤如下

  - 先读取内容

  - 替换内容

  - 清除原有内容

  - 写进新内容

  例如:

1 f = open('jlf.txt','a+',encoding='utf-8')
2     f.seek(0)
3     results = f.read()
4     content = results.replace('xiaolan','dalan')
5     f.seek(0)
6     f.truncate()    #清空文件内容,或者用w模式再打开一次
7     f.write(content)
8 f.close()

  (这种的弊端其实写在了上一条,高效处理文件的方法中,这种是把所有内容一次性拿来放在内存,改完之后再重新写回文件)

2. 逐行处理

  - 打开 a 文件

  - 从 a 读一行,修改,修改后写到 b 文件里

  - 删除 a 文件,把 b 重命名为 a

  例如:

1     with open('jlf.txt',encoding='utf-8') as f,open('aaaa.txt','w',encoding='utf-8') as f2:
2 
3         for line in f:
4         result = line.upper()
5         f2.write(result)
6 
7     import os
8     os.remove('jlf.txt')    #对文件的删除和重命名操作需要放在文件关闭之后
9     os.rename('aaaa.txt','jlf.txt')

 

七、最后贴一个练习

 监控服务器日志,要求找出每分钟访问超过100次的 ip 地址

 1 import time
 2 point = 0    #用来标记下面文件读取的位置,方便继续读取
 3 while True:    #自己再写忘记循环
 4     with open('access.log',encoding='utf-8') as f:
 5         f.seek(point)
 6         ips = {}
 7         for line in f:
 8             if line.strip() != '':    #忘记处理空行
 9                 ip = line.split(‘ ’)[0]    #split后的()以一个空格分隔时,可以空着不写(),也可以写入一个空格(' ')
10                 if ip in ips.keys():
11                     ips[ip] += 1
12                 else:
13                     ips[ip] = 1
14         point = f.tell()
15         for k in ips:
16             if ips[k] >= 100:
17                 print('有问题的 ip 是:',k)    #自己写时,输出应为 ip,写成了其对应的 key
18     time.sleep(60) 

 


八、json 操作

说白了 json 就是一个字符串。格式其实就是一个字典。
有的时候文件读取过程中,文件内存的是json,刚好我们读出来也需要转成字典格式,那就需要有一种方法可以直接识别这种格式,json 模块中刚好就带了这样的方法。
1.写文件
import json
d = {
        "error_code": 0,
        "stu_info": [
                {
                        "id": 314,
                        "name": "矿泉水",
                        "sex": "",
                        "age": 18,
                        "addr": "北京市昌平区",
                        "grade": "摩羯座",
                        "phone": "18317155663",
                        "gold": 100
                },
                {
                        "id": 315,
                        "name": "矿泉水",
                        "sex": "",
                        "age": 27,
                        "addr": "上海",
                        "grade": "摩羯座",
                        "phone": "18317155664",
                        "gold": 100
                }
        ]
}
with open('abc.txt','w',encoding='utf-8') as fw:
    #s = json.dumps(d,ensure_ascii=False,indent=4)    #把字典转成json,字符串
    #fw.write(s)
    
    json.dump(d,fw,indent=4,ensure_ascii=False)
 
 

有两种方法,dump 和 dumps。被注释的两行代码中用了 dump,但两行的作用相当于最后一行。也就是说,json 自带了 dumps 方法可以直接拿到要写入的对象,写到目标文档中。

2. 读文件

1 import json
2 with open('abc.txt',encoding='utf-8') as fr:
3     result = json.load(fr)
4     print(type(result))

json.load() 方法,非常方便,直接返回一个字典。



转载于:https://www.cnblogs.com/april-aaa/p/10939648.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值