Python操作文件-20181121
Python操作文件
Python操作文件和其他语言一样,操作的过程无非是先定位找到文件、打开文件,然后对文件进行操作,操作完成后关闭文件即可。
文件操作方式:对文件进行操作,主要就是读、写的方式,python有如下的几种文件操作方式:
- 只读:r,以只读的方式打开文件,只能够读取文件,不能够对文件内容进行修改或删除,文件操作的默认操作方式,附带编码格式为utf-8
- 只写:w,以只写的方式打开文件,操作的结果是将原文件内容清空,然后写入新的内容
- 追加:a,以追加的方式打开文件,追加和只写一样,不能对文件进行读,可以对文件进行写,但是追加比只写会好一点,在原文件的末尾开始加入新写入的内容。
- 读写:r+,对文件可读可写,光标在文件开头,文件的读写,都是以光标为标志位,在光标处开始读写。但是以r+打开的形式,读和写的光标是两个,这种模式是读和追加的方式,读可以任意读,写一定是从文件的最后开始写。使用的最多的方式。
- 写读:w+,对文件可读可写,创建一个文件,开始写,写的光标是0开始,读和写的光标是反的,写光标默认在文件开始0位置,读光标默认在文件的结尾位置。写追加。
- 追加读写:a+,追加读,
- 二进制读:rb,网络数据传输只能用二进制来传输,以b开头,
- 二进制写:wb,写入的时候,也要转码成二进制格式。需要编码,encode
文件的整个操作过程,都是先将文件从磁盘读取到内存中,然后通过内存操作,进行输入输出显示的。下面做一个简单的文件操作,有一个文件名为"song.txt",里面是一首歌,现在以不同的形式打开文件,进行读、写、追加的操作。文件打开是open,关闭是close。
file = open("song.txt","r",encoding="utf-8")
print(file.read())

简单的文件读取操作,以r的方式,打开文件,然后将文件全部读取出来。如果文件内容比较大,一次性全部读取到内存中,会比较占用内存资源,可不可以想一种办法,一行一行的读取文件,每次取一行数据进入内存中,然后打印,这个时候就有readline了。
file = open("song.txt","r",encoding="utf-8")
print(file.readline())
print(file.readline())
print(file.readline())

由于文件每行的结尾,都有一个换行符,所以在打印输出的时候,会有空行。
如果要读取的行特别多,500行上千行,可以使用for循环直接读取文件的前多少行
file = open("song.txt","r",encoding="utf-8")
for i in range(4):
print(file.readline())
可以一次性将文件以列表的形式取出,放在内存中,使用readlines方法,文件中的每行,都是以列表元素的形式存放,通过列表的index,可以取出对应的行数。
file = open("song.txt", "r", encoding="utf-8")
data = file.readlines()
print(data,type(data))

一次性将文件读取出来,对内存的消耗是很大的,尽量还是一行一行的读取,将文件变成一个可迭代的对象,然后一行一行的读取。对于迭代器,可以直接用循环进行读取。所以文件读取的标准方式是这样的:
#单行读取,迭代循环
file = open("song.txt", "r", encoding="utf-8")
for line in file:
print(line,type(line))

在这种情况下,是通过迭代循环的方式,将文件中的内容,一次取一行,然后打印出来,取出来的都是字符串类型的格式。内存中只存在一行内容。
文件的读取,是根据文件句柄光标来的,也可以认为是游标,cursor,通过tell方法,可以返回在读写过程中,光标所在文件中的位置,以字符计数。通过seek方法,可以将光标移动到想要的位置,需要指定位置,比如回到文件开始的位置,也就是0。Tell和seek可以搭配起来使用。终端设备文件不能用seek。
file = open("song.txt", "r", encoding="utf-8")
print("当前光标位置:",file.tell())
print(file.readline())
print("读取一行后,光标位置:",file.tell())
file.seek(21)
print(file.readline())
file.close()

Seek和tell的使用,可以通过tell查询当前读取或写入的光标的位置,然后seek移动到从文件开始0处,到目标设置的光标处,上面就是移动到21处,在python 中汉字是3个byte,所以一定要移动的数字是3的整数倍才能使用。但是第一行读完15个汉字,光标在44,是0-45,光标移动到21,前面有0-20个byte,也就是7个汉字。
打印文件的编码方式,encoding,直接将文件的编码方式返回。打印文件句柄在内存中的编号,也就是pid,fileno,每个文件在内存中打开,都有一个内存编号。在linux中通常在写脚本时候会用到合格pid,强制关闭某个进程。
刷盘,flush,从内存刷到磁盘,强制。这个特性和文件缓存有关系,文件的读写,都需要经过缓存,当缓存中的数据容量,达到刷盘范围,或者到刷盘时间,才会将数据刷到磁盘中,如果是文件直接写到磁盘,会影响文件的读写时间,因为磁盘读写比较慢,内存缓存读写是比磁盘快的。当数据还未写入到磁盘时,机器断电,就会出现内存缓存中的数据丢失,当要求文件强一致性时,可以通过flush进行强制刷盘,将内存缓存中写入的文件,刷入到磁盘中。
主要的使用场景,就是在进度条上面,会使用flush。Sys模块。
下面简单做一个进度条的样子。
import sys,time
for i in range(10):
sys.stdout.write("\r%s"%("#"*i))
sys.stdout.flush()
time.sleep(0.5)
每间隔0.5秒打印一次输出,输出之前,清除上一次的输出,每次输出强制性刷新到屏幕上展示。优化的好一点的代码如下。
import sys,time
def percent(number,total=100):#定义一个函数,用来显示百分数
percent_number="%d"%(number/total*100)+"%"
return percent_number
for i in range(100):
sys.stdout.write("\r[%s%s%s]"%(("#"*i),(" "*(100-i)),percent(i)))
sys.stdout.flush()
time.sleep(0.5)
最后打印的结果如下图所示。

解释一下,在占位符中,%d表示将结果以数字的形式。不带小数的数字。
截断,truncate,如果不带任何参数,就会清空文件,如果带上一个参数,数字,就会从文件开头开始,多少个字符之后,删除之后的所有内容。
文件修改操作
在原文件上的修改(磁盘),是直接替换了该位置上面的数据。修改只能是先将文件从磁盘加载到内存中,整个修改操作是在内存中进行的,当修改完成后,将内存中的数据写入到原文件中。内存中在原位置上出入,之后的数据就会往后顺序排,所以在内存中能实现插入。在原文件上修改,或者是在内存中修改,写入到新的文件中。打开两个文件,一个是原文件,一个是目标文件,从原文件中读取数据,替换成新数据之后,写入到目标文件中。
下面做一个简单的替换,生成一个新文件,将旧文件中的某些字段替换。
file_old = open("song.txt",'r',encoding='utf-8')
file_new = open("song_new.txt",'w',encoding='utf-8')
for line in file_old:
if "你" in line:
line = line.replace("你","她")
file_new.write(line)
file_old.close()
file_new.close()
从song.txt中读取文件,然后将里面的"你",替换成"她",然后将新的数据,写入到新文件中。
而想普通编辑器vim、ue等,在用户体验上感觉都是在原文件上的修改,实际上是先将文件读取到内存中,然后对内存对象进行修改,修改完成后,以写的方式重新打开原文件,然后完成覆盖。所以保存之后是直接写到原文件中的。实现的代码可以简单写一下。整个过程中,文件是全部读取进内存中的,如果文件比较大,读取的过程会很长。
file_old = open("song.txt",'r',encoding='utf-8')
data_old = file_old.readlines()
file_old.close()
file_new = open("song.txt",'w',encoding='utf-8')
for line in data_old:
if "你" in line:
line = line.replace("你","她")
file_new.write(line)
file_new.close()
Python操作文件-20181121的更多相关文章
- Python操作文件、文件夹、字符串
Python 字符串操作 去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sSt ...
- Python操作文件和目录
Python操作文件和目录 读写文件比较简单,有一点特别注意就好了 windows下Python默认打开的文件以gbk解码,而一般我们的文件是utf-8编码的,所以如果文本含有中文,就会出现异常或者乱 ...
- python操作文件练习,配置haproxy
在使用python操作文件的时候,特别是对于网络设备,通常操作配置文件,会简化配置量,配置文件加载到内存中,运行时使用的是内存中的配置,内存中配置修改后立即生效,如果不将配置内容保存到硬盘中,则下次重 ...
- 使用python操作文件实现购物车程序
使用python操作文件实现购物车程序 题目要求如下: 实现思路 始终维护一张字典,该字典里保存有用户账号密码,购物车记录等信息.在程序开始的时候读进来,程序结束的时候写回文件里去.在登录注册的部分, ...
- 用Python操作文件
用Python操作文件 用word操作一个文件的流程如下: 1.找到文件,双击打开. 2.读或修改. 3.保存&关闭. 用Python操作文件也差不多: f=open(filename) # ...
- python操作文件案例二则
前言 python 对于文件及文件夹的操作. 涉及到 遍历文件夹下所有文件 ,文件的读写和操作 等等. 代码一 作用:查找文件夹下(包括子文件夹)下所有文件的名字,找出 名字中含有中文或者空格的文件 ...
- open -python操作文件
一打开文件 二操作文件 三关闭文件 open(文件,模式,编码),打开文件----->0101010(以二进制的方式打开)------>编码(open默认utf-8编码)------> ...
- Python操作文件文档
需要帮老师将44G的图书分类一下,人工当然累死了.所以用Python大法处理一下. 思路是读取文件目录下的书名,然后去百度百科查分类,如果还没有就去豆瓣,当当查.哪一个先找到其余的就不用找了.如果没有 ...
- Python 操作文件、文件夹、目录大全
# -*- coding: utf-8 -*- import os import shutil # 一. 路径操作:判断.获取和删除 #1. 得到当前工作目录,即当前Python脚本工作的目录路径: ...
随机推荐
- Python HTML解析器BeautifulSoup(爬虫解析器)
BeautifulSoup简介 我们知道,Python拥有出色的内置HTML解析器模块——HTMLParser,然而还有一个功能更为强大的HTML或XML解析工具——BeautifulSoup(美味的 ...
- javaweb学习--javabean
阅读电子书<Java Web从入门到精通>密码:461c,学习JavaWeb基础知识 JavaBean类似于.net的实体类,但是规则上稍复杂一些,能实现的功能也多一些 一.介绍 1.规则 ...
- SQLServer之创建非聚集索引
开始之前 典型实现 可以通过下列方法实现非聚集索引: UNIQUE 约束 在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束. 如果不存在该表的聚集索引,则可以 ...
- Linux中删除特殊名称文件的多种方式
今日分享:我们在肉体的疾病方面花了不少钱,精神的病害方面却没有花什么,现在已经到了时候,我们应该有不平凡的学校.--<瓦尔登湖> 前言 我们都知道,在linux删除一个文件可以使用rm命令 ...
- Django REST framework基础:序列化
表结构: class Article(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(m ...
- RabbitMQ远程执行任务RPC。
如果想发一条命令给远程机器,再把结果返回 这种模式叫RPC:远程过程调用 发送方将发送的消息放在一个queue里,由接收方取. 接收方再把执行结果放在另外一个queue里,由发送方取 实际上,发送方把 ...
- 【English】20190321
Keep in mind记住[kip ɪn maɪnd] maintenance维护[ˈmentənəns] Also Keep in mind that table maintenance use ...
- Redis学习笔记(2)——Redis的下载安装部署
一.下载Redis Redis的官网下载页上有各种各样的版本,如图 但是官网下载的Redis项目不正式支持Windows.如果需要再windows系统上部署,要去GitHub上下载.我下载的是Redi ...
- mac 开发新户攻略-brew
原文 https://www.cnblogs.com/kccdzz/p/7676840.html 这里为了备份一下,方便我自己寻找. 1.介绍 brew是一个软件包管理工具,类似于centos下的yu ...
- 阿里云RDS for MySQL 快速入门——笔记
1初始化配置 1.1设置白名单 创建RDS实例后,需要设置RDS实例的白名单,以允许外部设备访问该RDS实例.默认的白名单只包含默认IP地址127.0.0.1,表示任何设备均无法访问该RDS实例. 设 ...