当前位置: 首页 > 编程日记 > 正文

第三章| 3.1文件处理

1、三元运算

简单条件语句:

if 条件成立:val = 1
else: val = 2 

改成三元运算:

val = 1 if 条件成立 else 2

2、文件处理 (用python对硬盘上的文件操作)

读取文件的三个方法:read()、readline()、readlines()

三个方法均可接受一个变量用以限制每次读取的数据量,通常不使用该变量。

关于read()方法: 1、读取整个文件,将文件内容放到一个字符串变量中 2、如果文件大于可用内存,不可能使用这种处理

关于readline()方法: 1、readline()每次读取一行,比readlines()慢得多 2、readline()返回的是一个字符串对象,保存当前行的内容

关于readlines()方法: 1、一次性读取整个文件。 2、自动将文件内容分析成一个行的列表。

f = open(file = "兼职白领学生空姐模特护士联系方式.txt",mode="r",encoding="utf-8") #r模式以什么方式存的就要以什么方式读出来。如果文件是gbk格式,就encoding=“gbk”
data = f.read() #read方法是把文件全部读出到屏幕输出;readline是读取文件的一行信息;readlines是读取整个文件,输出屏幕的是一行包含所有的信息。
print(data)  
f.close() #一定要加上这个,不然数据文件数据就没有了,哎呀
read打印:
王心       北京    159    46    13813234424
马纤羽     深圳    173    50    13744234523
乔亦菲     广州    172    52    15823423525
罗梦竹     北京    175    49    18623423421
刘诺涵     北京    170    48    18623423765
岳妮妮     深圳    177    54    18835324553
贺婉萱     深圳    174    52    18933434452
叶梓萱     上海    171    49    18042432324
杜姗姗     北京    167    49    13324523342
black girl 河北    167    50    135423422334readline:
王心       北京    159    46    13813234424readlines:
['王心       北京    159    46    13813234424\n', '马纤羽     深圳    173    50    13744234523\n', '乔亦菲     广州    172    52    15823423525\n', '罗梦竹     北京    175    49    18623423421\n', '刘诺涵     北京    170    48    18623423765\n', '岳妮妮     深圳    177    54    18835324553\n', '贺婉萱     深圳    174    52    18933434452\n', '叶梓萱     上海    171    49    18042432324\n', '杜姗姗     北京    167    49    13324523342\n', 'black girl 河北    167    50    135423422334']

存在硬盘上是二进制。以什么方式存的文件,就要以什么样的方式打开这个文件。此处的encoding必须和文件在保存时设置的编码一致,不然“断句”会不准确从而造成乱码。
r文本模式
二进制转换为字符串。open把它转一下。

rb为二进制模式,把这段内容直接读到内存里边来,硬盘怎么存的就怎么拿来,不用它转了。 视频、图片或者网络传输的文本,都是二进制模式。
f = open(file = "兼职白领学生空姐模特护士联系方式.txt",mode="rb") #二进制模式就不需要encoding了
data = f.read()
print(data)  #打印出来就是二进制格式
f.close()
打印:
b'\xe7\x8e\x8b\xe5\xbf\x83       \xe5\x8c\x97\xe4\xba\xac    159    46    13813234424\r\n\xe9\xa9\xac\xe7\xba\xa4\xe7\xbe\xbd     \xe6\xb7\xb1\xe5\x9c\xb3    173    50    13744234523\r\n\xe4\xb9\x94\xe4\xba\xa6\xe8\x8f\xb2     \xe5\xb9\xbf\xe5\xb7\x9e    172    52    15823423525\r\n\xe7\xbd\x97\xe6\xa2\xa6\xe7\xab\xb9     \xe5\x8c\x97\xe4\xba\xac    175    49    18623423421\r\n\xe5\x88\x98\xe8\xaf\xba\xe6\xb6\xb5     \xe5\x8c\x97\xe4\xba\xac    170    48    18623423765\r\n\xe5\xb2\xb3\xe5\xa6\xae\xe5\xa6\xae     \xe6\xb7\xb1\xe5\x9c\xb3    177    54    18835324553\r\n\xe8\xb4\xba\xe5\xa9\x89\xe8\x90\xb1     \xe6\xb7\xb1\xe5\x9c\xb3    174    52    18933434452\r\n\xe5\x8f\xb6\xe6\xa2\x93\xe8\x90\xb1     \xe4\xb8\x8a\xe6\xb5\xb7    171    49    18042432324\r\n\xe6\x9d\x9c\xe5\xa7\x97\xe5\xa7\x97     \xe5\x8c\x97\xe4\xba\xac    167    49    13324523342\r\nblack girl \xe6\xb2\xb3\xe5\x8c\x97    167    50    135423422334'

自动检测编码:(不知道原文件是什么编码)
import chardet
f = open('log',mode='rb')
data = f.read()
f.close()result = chardet.detect(open('log',mode = 'rb').read())
print(result)  #{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

 循环文件 (边读边处理,内存就存一小块。)

f = open("兼职白领学生空姐模特护士联系方式.txt",'r',encoding="gbk")
for line in f:print(line)
f.close()
#循环打印出:
王心 北京 159 46 13813234424马纤羽 深圳 173 50 13744234523乔亦菲 广州 172 52 15823423525罗梦竹 北京 175 49 18623423421刘诺涵 北京 170 48 18623423765岳妮妮 深圳 177 54 18835324553贺婉萱 深圳 174 52 18933434452叶梓萱 上海 171 49 18042432324杜姗姗 北京 167 49 13324523342black girl 河北 167 50 135423422334

写文件(w是创建不是修改,没有就清空覆盖了。)   w给转换,而wb 二进制的就不用转换了。

f = open("兼职.txt",'w',encoding = "gbk") #创建一个文件以gbk的形式
f.write(“路飞学城!”) #”路飞学城”是以unicode的形式写的,再编码为gbk
f.close()
f = open("兼职2.txt",'wb') #创建一个兼职2的文件
f.write(“路飞学城!”.encode("gbk")) #encode下表示以什么样的编码存在
f.close()
f = open("兼职.txt",'wb')
f.write("原子二号".encode("gbk")) #新写进去的没有的就清除再创建,会把原来的文件被清空了。
f.close()

 

追加模式(修改,追加到文件尾部。以a或者ab的模式打开)

f = open("兼职白领学生空姐模特护士联系方式.txt",'ab') #以ab的模式打开 
f.write("\n肛娘    北京  167   55   13312340322”.encode("gbk"))#追加到文件后面,\n为换行
f.close()

比如:追加“给岁月以文明,而不是给文明以岁月”在第五行。(就是把其他的内容往下挤,不是覆盖第五行)(见练习题)

lines = []
f = open('三体语录','r',encoding='utf-8')
for line in f:lines.append(line)
lines.insert(5,'给岁月以文明,而不是给文明以岁月\n')
s = ''.join(lines)  #把列表转成字符串
with open('三体语录','w',encoding='utf-8')as f_write:f_write.write(s)f_write.close()

混合操作(既能写又能读即 读写模式。r+ )

  

  读写就相当于append,只是多了个可以读。

写读模式 w+  (几乎没什么应用场景)

读写是先读后写,以读的模式打开然后往后继续追加;写读模式,是以写的模式打开(就是创建的模式)支持你读,把你写的读出来,但是之前的被清空了。

  

文件操作的其他功能

   def fileno(self, *args, **kwargs): # real signature unknown返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到def flush(self, *args, **kwargs): # real signature unknown把文件从内存buffer里强制刷新到硬盘def readable(self, *args, **kwargs): # real signature unknown判断是否可读def readline(self, *args, **kwargs): # real signature unknown只读一行,遇到\r or \n为止def seek(self, *args, **kwargs): # real signature unknown把操作文件的光标移到指定位置*注意seek的长度是按字节算的, 字符编码存每个字符所占的字节长度不一样。如“路飞学城” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“飞”和“学”两个字中间。但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节def seekable(self, *args, **kwargs): # real signature unknown判断文件是否可进行seek操作def tell(self, *args, **kwargs): # real signature unknown返回当前文件操作光标位置 def truncate(self, *args, **kwargs): # real signature unknown按指定长度截断文件*指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。def writable(self, *args, **kwargs): # real signature unknown判断文件是否可写

flush 强制把内存刷到硬盘。

  flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入,   正常情况下缓冲区满时,操作系统会自动将缓冲数据写入到文件中。

一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。

至于close方法,原理是内部先调用flush方法来刷新缓冲区,再执行关闭操作,这样即使缓冲区数据未满也能保证数据的完整性。

  

readline()

tell()返回当前文件操作光标位置;  seek()把操作文件的光标移到指定位置。

  

seek(3)真的是字符吗?不是的,seek是找的是字节。  tell()是寻找光标的位置 。read是读的字符,tell和seek是找的字节。

utf-8中一个中文占3个字节,gbk中一个中文占2个字节。

>>>f = open('兼职白领学生空姐模特护士联系方式.tex',‘r’, encoding='gbk')   #文件里边:hello world! 
>>>f.seek(3)
3
>>>f.readline()
'lo world!'

  

 truncate()按指定长度截断文件 要以r+的模式打开   *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。

 

    

 文件修改 (两种方式:要么占内存要么占硬盘)

把光标seek到中间的位置就可以了。

占硬盘修改,打开旧文件一行行的读,新文件一行行的写。  最后把新文件重命名为旧文件,就把它覆盖掉了。命名要 import os

import os
f_name = "兼职白领学生空姐模特护士联系方式.txt" f_new_name = "%s.new" %f_nameold_str = "乔一菲" new_str = "红娘"f = open(f_name,"r",encoding="utf-8") f_new = open(f_new_name,"w",encoding="utf-8")for line in f:if old_str in line:line = line.replace(old_str,new_str)f_new.write(line)f.close() f_new.close()os.rename(f_new_name,f_name) #把新文件名字改成原文件 的名字,就把之前的覆盖掉了

占内存方式:以r+模式打开文件全read在内存,直接.replace,全程读一遍然后再seek到文件开头,再写进去就覆盖掉了。不一定能全部覆盖,怎么办:先把文件truncate完,flush

#占内存方式修改 
f = open('兼职白领学生空姐模特护士联系方式.txt','r+',encoding='utf-8')
f1 = f.readlines()
f.seek(0)  #这个一定要加
old_str = "乔亦菲"
new_str = "Yifei Qiao"
for line in f1:if old_str in line:line = line.replace(old_str,new_str)f.write(line)
#f.truncate()
#f.flush()
f.close()
#################
f = open(r"info.txt", "r+")
l = f.readlines()
f.seek(0)  # 指针指向文件开头
old_str = "唐三"
new_str = ""
for line in l[0::2]:  # 只取部分字符if old_str in line:line = line.replace(old_str,new_str)f.write(line+"\n")
f.truncate()
# 对文件进行截取,如果文件之前为100M,
# 修改后文件只覆盖了50M,如果不使用truncate不会整体覆盖,只会部分覆盖,后面剩余的50M内容会追加新文件中,修改后的文件大小不变
# 使用truncate后,文件就只有50M,他会把剩余的50M内容从当前write的指针后面进行截取
f.close()

 对文件的删除

如:删除最后一行

with open('三体语录','r',encoding='utf-8') as f:f1 = f.readlines()  ##readline 和readlines的区别with open('三体语录','w',encoding='utf-8')as f_w:for line in f1:if '25' in line:continue  #跳出本次循环f_w.write(line)

转载于:https://www.cnblogs.com/shengyang17/p/8570312.html

相关文章:

LR常见的报错处理方法

1.LR录制时不弹出IE浏览器 当一台主机上装有多个浏览器,LR录制脚本时,经常遇到打不开浏览器的情况,可以用下面的方法来解决 启动浏览器,打开Internet 选项对话框,切换到高级标签,去掉“启用第三方浏览器扩展…

均匀分布取某一点概率_概率和概率分布

概率与概率分布是统计学中的基础概念,在我们的高中的课本中就接触过了,如果有遗忘,一起来回顾一下吧!知识点:概率概率分布一、概率说到概率,需要先了解一个概念,叫做随机试验。随机试验是指在相…

EOS共识机制——DPoS代理权益证明

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链共识机制与它的演进,是由于区块链式去中心化而且分布式的系统,必须要有一套放诸四海皆准类似宪法的规则,来…

active mq topic消费后删除_Spring cloud stream 整合mq

说明:本案例win10环境测试scs(spring cloud stream)整合kfk(kafka)/rbt(rabbitmq)消息生产消费场景流程一、准备中间件环境(kfk/rbt)后续内容提供kfk与rbt的环境准备流程二、导入scs的依赖项目spring boot 版本:2.1.3.RELEASE引入spring cloud 版本&…

翻译的艺术 —— 无能为力的翻译,搞笑的音译

0. 无能为力的翻译 至尊宝:best sonny,乌龙:own goal,的粤语发音;1. 取其发音 word ⇒ 我的,word 妈呀, Need just word,word has word,你的就是我的,我的还是我的&#…

经常可能会用到的【函数节流和函数防抖】记录下,做下区分

今天突然被人问到,函数节流和函数防抖的区别是什么,结果我脑子一热直接举了个滚动条的粟子说是优化高频率执行的手段,就记得自己是用setTimeout来实现的。完了区别是什么??哪个是哪个都蒙B了回家想想,有些东…

智能合约和区块链技术:入门指南

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 智能合约和区块链技术:入门指南 多年前,在没有数字合约和区块链技术存在的情况下,双方的合约往往以传统的方式进…

2. 尾部的零

题目 设计一个算法,计算出n阶乘中尾部零的个数 样例 11! 39916800,因此应该返回 2 题解 一开始就用最简单对1-n找出5的个数,然后超时了。虽然都直到是要找5,因为2肯定比5多,所以5的个数就是0的个数,只是计…

case when then else end

1、根据数据库表中特定的值进行排序显示 select * from tablename where order by case when columname then 1 wnen columname when 2 else 3 end 2、根据数据库中存的值根据情况对其进行赋值CASE sexWHEN 1 THEN 男WHEN 2 THEN 女 ELSE 其他 END --Ca…

python replace函数_Python3 replace()函数使用方法

描述 replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。 语法replace()方法语法: str.replace(old, new[, max]) 参数 old -- 将被替换的子字符串。 new -…

EOS技术知识介绍

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 EOS 简介 EOS:EOS可以理解为Enterprise Operation System,即为商用分布式应用设计的一款区块链操作系统。EOS是EOS软件引入…

团体程序设计天梯赛-练习集-L1-044. 稳赢

L1-044. 稳赢 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每…

currenttimemillis 毫秒还是秒_Elasticsearch(ES)如何做到亿级数据查询毫秒级返回

前言:这个问题其实是更面向原理及实操方面的内容。换个问法,可以是这样来问:ES 在数据量很大的情况下(数十亿级别)如何提高查询效率?为了精简,如下内容将Elasticsearch简称为ES如果你仅仅是用过ES,对于这个…

分布式系统的时间顺序

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 分布式系统的时间顺序 区块链被认为是分布式的系统,分布式系统中由于多节点,通讯、物理位置等的问题,各节点间时…

JVM 老年代对象来源

一般情况是四种,但是尤其以第一种来源最多1.新生代对象每经历依次minor gc,年龄会加一,当达到年龄阀值会直接进入老年代。阀值大小一般为152.Survivor空间中年龄所有对象大小的总和大于survivor空间的一半,年龄大于或等于该年龄的…

[心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连...

此文讲述的内容是一个实际项目开发中的一部分内容,笔者将亲身经历写成文章。 【背景】 现 需要实现这样的功能:有多个客户端连着同一个服务器。服务器和客户端之间需要“互相”知道彼此的连接状态。比如在某一时刻,服务器需要知道当前有多少个…

python绝对值编程_Python-abs vs fabs

编辑:正如aix所建议的,比较速度差异的更好(更公平)方法是:In [1]: %timeit abs(5) 10000000 loops, best of 3: 86.5 ns per loop In [2]: from math import fabs In [3]: %timeit fabs(5) 10000000 loops, best of 3:…

如何搭建以太坊私有链

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 如何搭建以太坊私有链1 今天讲一下如何搭建以太坊私有连,当然了在你阅读这篇文章的时候,最好是有一定基础,比如…

Autocomplete 自动补全(Webform实战篇)

开篇语 因为项目中需要用到一个自动补全的功能,功能描述: 需求一:新增收件人的时候,自动下拉显示出数据库中所有的收件人信息(显示的信息包括:姓名-收件地址-联系方式) 需求二:选中一…

前端开发基础7(Bootstrap框架)

Bootstrap介绍 Bootstrap是Twitter开源的基于HTML、CSS、JavaScript的前端框架。 它是为实现快速开发Web应用程序而设计的一套前端工具包。 它支持响应式布局,并且在V3版本之后坚持移动设备优先。 为什么要使用Bootstrap? 在Bootstrap出现之前&#xff1…

python自动化测试难不难_Python测试自动化好学还是Pythonweb开发好学?

还是测试吧。。。 用动态语言搞开发,项目大了根本没法维护,而且还会bug层出不穷,任谁也Hold不住。真想搞开发,要么玩Java,要么玩C#。 下面举个例子。 比如一个游戏项目,是这样的(伪代码):角色 l…

以太坊智能合约开发第二篇:理解以太坊相关概念

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 很多人都说比特币是区块链1.0,以太坊是区块链2.0。在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成…

【python之旅】python的基础二

一、集合的操作 1、什么是集合? 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重:把一个列表变成集合,就自动去重关系测试:测试两组数据之前的交集,差集,并集…

hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?

前言大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗?今天带大家来了解一下equals和hashcode重写的实现。set是如何去重的&#xff1f…

LazyT 延迟加载

namespace ConsoleAppTest {class Program{static void Main(string[] args){Lazy<Student> student new Lazy<Student>();//默认未初始化Console.WriteLine(student);//在第一次使用时才实例化Console.WriteLine(student.Value);Console.ReadLine();}public clas…

如何编写一个可升级的智能合约

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 如何编写一个可升级的智能合约 区块链信任基础的数据不可修改的特性&#xff0c;让它传统应用程序有一个很大的不同的地方是一经发布于区块链上就…

用ILSpy查看Session.SessionID的生成算法

缘由 asp.net Session在InProc模式下&#xff0c;容易丢失&#xff0c;经常需要重新登录&#xff0c;且不支持分布式共享。   所以在研究Redis实现原生的Session,本来想用GUID作为key存入cookie&#xff0c;又在想能不能实现跟Session一样的id 实现 ILSpy 是一个开源的.NET反…

java 中 bean 的生命周期

java 中 bean 的生命周期 本篇中会对涉及到的知识点皆做出描述&#xff1a; 首先&#xff0c;我们先了解先虚拟机的类加载机制&#xff1a; 虚拟机把描述类的数据从Class 文件中加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接…

python简易版实例_Python3之简单搭建自带服务器的实例讲解

WEB开发&#xff0c;我们先从搭建一个简单的服务器开始&#xff0c;Python自带服务模块&#xff0c;且python3相比于python2有很大不同&#xff0c; 在Python2.6版本里&#xff0c;/usr/bin/lib/python2.6/ 目录下会有 BaseHTTPServer.py, SimpleHTTPServer.py, CGIHTTPServer.…

如何选择分布式系统(区块链)协议?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 如何选择分布式系统&#xff08;区块链&#xff09;协议? 在构建包分布式系统功能的应用程序时&#xff0c;《财富》500强企业和创始人经常问我们…