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脚本工作的目录路径: ...
随机推荐
- 从0开始的Python学习001快速上手手册
假设大家已经安装好python的环境了. Windows检查是否可以运行python脚本 Ctrl+R 输入 cmd 在命令行中输入python 如果出现下面结果,我们就可以开始python的学习了. ...
- 使用Linq的泛型功能
泛型数据访问类: 业务抽象类使用数据访问类: 业务类继承业务抽象类: 使用业务类:
- android glide图片加载框架
项目地址: https://github.com/bumptech/glide Glide作为安卓开发常用的图片加载库,有许多实用而且强大的功能,那么,今天就来总结一番,这次把比较常见的都写出来,但并 ...
- Docker概述
Docker概述 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全可以使用沙盒机制,互 ...
- 22 python 初学(类,面向对象)
python: 函数式 + 面向对象 函数式可以做所有的事,是否合适? 面向对象: 一.定义: 函数: def + 函数名(参数) 面向对象: class -> 名字叫 Bar 类 def ...
- leetcode 169. Majority Element 、229. Majority Element II
169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...
- NodeJS之异常处理
1. 为什么要处理异常? 如果我们不处理异常的话,直接会导致程序奔溃,用户体验比较差,因此我们要对异常进行处理,当出现异常的情况下,我们要给用户一个友好的提示,并且记录该异常,方便我们排查. 2. 在 ...
- Python OpenCV 图像处理初级使用
# -*- coding: utf-8 -*-"""Created on Thu Apr 25 08:11:32 2019 @author: jiangshan" ...
- C# Json字符串保存信息
1.我们在进行数据通信的时候,往往是需要传输一个字符串类型的参数,而这个字符串类型的参数又需要封装大量的数据信息. 这个时候,就需要使用Json来封装这些数据,最后将Json数据以字符串的格式输出 2 ...
- centos7 安装mysql5.7
[root@izbp1buyhgwtrvlxv3u2gqz soft]# wget http://dev.mysql.com/get/mysql57-community-release-el7-8.n ...