测开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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用docker在CentOS7上搭建WordPress

前言 本文基于Centos 7 环境的docker搭建操作,centos 7 用 firewalld 替换了iptables作为默认防火墙操作,但以前习惯了iptables 就不与时俱进了。 环境准备 systemctl disable firewalld systemctl stop firewalld setenforce 0 sed -i "s/SELIN…

企业级应用,如何实现服务化一(项目架构演化)

1.企业级应用架构演化 1.1.架构演化图 1.2.文字描述 #单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本#垂直应用架构当访问量逐渐增大,单一应用增加机器带来的加速度越来越小&#xff0c…

Alpine 操作系统是一个面向安全的轻型 Linux 发行版

Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时&…

ASP.NET MVC Filter过滤机制(过滤器、拦截器)

https://blog.csdn.net/knqiufan/article/details/82413885 本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/knqiufan/article/details/82413885参考文章:1、https://www.cnblogs.com/webapi/p/5669057.html 2、htt…

elk docker

换了个运行环境,重新搭建一套公司本地内部的ELK,之前也搭过(可访问:https://yanganlin.com/31.html),最近做什么事情都想用Docker,这次也用Docker,还算顺利,没掉什么坑里,上次搭建,也用用的6.2的版本,这都过了一年,Elk这三个产品,都已经上7了,用docker搭建的还是用6.2.4,稳定不…

LeetCode Largest Number

1231231转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10954249.html

有个需求mybatis 插入的时候不知道有哪些字段,需要动态的传入值和字段

有个需求mybatis 插入的时候不知道有哪些字段,需要动态的传入值和字段, Java code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Test public void testAddProductGuaranty() { //1 560 50000 2014/10/2 0:00:00 2014/11/1 0…

readonly的用法

转载于:https://www.cnblogs.com/w123w/p/10958567.html

mybatis insert 动态生成插入的列及插入的值

代码如下 &#xff1a; 1.mapper.xml 文件 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper name…

loj2245 [NOI2014]魔法森林 LCT

[NOI2014]魔法森林 链接 loj 思路 a排序&#xff0c;b做动态最小生成树。 把边拆成点就可以了。 uoj98.也许lct复杂度写假了、、越卡常&#xff0c;越慢 代码 #include <bits/stdc.h> #define ls c[x][0] #define rs c[x][1] using namespace std; const int N 2e5 7; …

Jenkins发布spring boot到hub.Docker 方法

在生成的目录下&#xff0c;建立个文件&#xff0c;文件名称为&#xff1a;Dockerfile FROM java:8 VOLUME /tmp ADD target/assignment-0.0.1-SNAPSHOT.jar /dalaoyang.jar ENTRYPOINT ["java","-Djava.security.egdfile:/dev/./urandom","-jar&q…

网页视频直播、微信视频直播技术解决方案:EasyNVR与EasyDSS流媒体服务器组合之区分不同场景下的直播接入需求...

背景分析 熟悉EasyNVR产品的朋友们都知道&#xff0c;EasyNVR不仅可以独成体系&#xff0c;而且还可以跟其他系列产品相配合&#xff0c;形成各种不同类型的解决方案&#xff0c;满足各种不同应用场景的实际需求。针对很多设备现场没有固定公网IP&#xff0c;但是又想实现公网、…

如何解决VMware Workstation 10.0.0 build-1295980马赛克现象

VMware Workstation 10.0.0 build-1295980偶尔出现客户机马赛克现象&#xff0c;可切换至其它选项卡&#xff0c;再切换回去即可。 还有一种方式是关闭加速3D图形。 转载于:https://www.cnblogs.com/rms365/p/10961499.html

不同账号间的云资源授权方法

阿里云的访问控制RAM产品可以实现资源的分配和授权,在一个特殊的业务背景下,资源也可以实现跨账号的授权使用. 背景: 1.A公司,作为甲方Party A,出资购买云资源,对云资源具有所有权,但不实际管理,需要乙方配合. 2.B公司,作为乙方Party B,要管理A公司的云资源,需要A公司授权云资…

知乎上已获千赞,全网独家首发!

前言 选了开发这一行&#xff0c;就意味着想混得好就要持续学习&#xff0c;你的技术和薪资、位置直接挂钩&#xff0c;进步对于程序员的重要性就不赘述了&#xff0c;接下来作为过来人&#xff0c;为广大同行分享一些学习干货&#xff0c;希望可以帮到大家 1、网络 网络协议…

知乎上已获千赞,持续更新中

前言 不知不觉自己已经做了几年开发了&#xff0c;由记得刚出来工作的时候感觉自己能牛逼&#xff0c;现在回想起来感觉好无知。懂的越多的时候你才会发现懂的越少。 如果你的知识是一个圆&#xff0c;当你的圆越大时&#xff0c;圆外面的世界也就越大。 最近看到很多Androi…

centos下搭建Jenkins持续集成环境(安装jenkins)

centos下搭建Jenkins持续集成环境(安装jenkins) 1、安装JDK yum install -y java 2、安装jenkins 添加Jenkins库到yum库&#xff0c;Jenkins将从这里下载安装。 1 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo 2 rpm --import h…

elementUi Dialog 对话框使用中数据获取问题

Dialog 对话框&#xff1a;使用中数据获取问题演示代码&#xff1a; <div class"centerContent"><ul><li class"contentBox" v-for"(notice,index) in systemNotices" :key"index"> //循环取值<div class&quo…

全志_功能引脚配置_sys_config.fex

\lichee\tools\pack\chips\sun8iw5p1\configs\vstar\sys_config.fex;---------------------------------------------------------------------------------------------------------————————; port configuration:; port_name port:GPIO<mux><pull up/down&…

离开小厂进大厂的第一周,BTAJ大厂最新面试题汇集,面试总结

大佬带你走进Android开发的世界&#xff0c;掌握了这些知识点&#xff0c;学习Android也可以很轻松。 核心分析内容 对于怎么学习Android&#xff0c;主要解决的是3个问题&#xff1a;学什么、怎么学 & 怎么用。 具体如下&#xff1a; 下面&#xff0c;我将带着上述几个问…