转载:https://www.cnblogs.com/zhxwind/p/8761618.html

文件的读写有三种形式:读、写和追加。

一、读模式 r 和读写模式 r+

1、读模式 r

读模式r特点:(1)只能读,不能写;(2)文件不存在时会报错。

(1)例:读取当前目录下的books.txt文件,该文件如下所示。

   

解析:

a、用open打开文件,在python3中只有open。python2可以用open和file。关闭文件是close()。一般有开就有关

b、如果在当前目录,可以直接写文件名,否则需添加路径。

c、如果不写 'r',即写成  f = open('books.txt'),也是默认读模式。

d、read可以将文件所有的内容都读出来

e、另外,有时需要添加解码格式 encoding ,格式为:

  1. f = open('books','r',encoding='utf-8')

(2)

read:读取文件全部内容

readline:读取一行

readlines:读取每一行,并且放到一个list里

  

  

2、读写模式 r+

读写模式r+特点:(1)文件不存在时会报错;(2)可以读,也可以写,是覆盖写,会把文件最前面的内容覆盖

  

‘水浒传’把‘平凡的’三个字覆盖,原来的文件变为:

二、写模式 w 和写读模式 w+

1、写模式

写模式w特点:(1)只能写,不能读;(2)写的时候会把原来文件的内容清空;(3)当文件不存在时,会创建新文件。

如下,写入‘水浒传’时,将原来的内容都清空。

   

f.flush():有时我们用f.write()后,会发现没有写入文件,这是因为内容存在了缓冲区,需要等缓冲区满了之后,再把所有数据写入。此时可以用f.flush()强制把缓冲区里面的数据写到磁盘上。

 2、写读模式 w+

写读模式w+特点:(1)可以写,也可以读;(2)写的时候会把原来文件的内容清空;(3)当文件不存在时,会创建新文件。

三、追加模式a和追加读模式a+

1、追加模式a

追加模式a特点:(1)不能读;(2)可以写,是追加写,即在原内容末尾添加新内容;(3)当文件不存在时,创建新文件。

将‘水浒传’添加到原内容的末尾

2、追加读a+模式

追加读a+模式特点:(1)可读可写;(2)写的时候是追加写,即在原内容末尾添加新内容;(3)当文件不存在时,创建新文件。

以上几种模式,可以用下表来总结:

读写模式 是否可读 是否可写 文件不存在时
r 报错
r+ 是,覆盖写 报错
w 是,清空原内容 创建新文件
w+ 是,清空原内容 创建新文件
a 是,追加写 创建新文件
a+ 是,追加写 创建新文件

四、文件指针

文件指针用来记录文件走到哪里。

文件指针是很重要的,我们看下面的例子中,read将books.txt的内容全部读了出来,readline则没有读出任何内容。原因是read读完之后,文件指针到了文件的末尾,此时readline接着从这个位置开始读,肯定是没内容的。因此有时需要调整文件指针的位置。

   

seek可以移动文件指针,移动后只是针对读,用追加模式写的时候,还是在末尾写。

另外,seek(num),这个num指的是字符,不是行。

在上面的代码中,加一句f.seek(0),即可将指针移到文件开头。这次,readline就可以从头开始读了。

  

五、自动关闭文件

with可以自动关闭文件,用法如下:

  1. with open('books.txt','a+') as f:
  2. f.write('\n三体')

六、文件修改

1、简单粗暴直接修改

最简单粗暴的修改文件,步骤是:

(1)打开文件,获取文件内容;

(2)对内容进行修改;

(3)清空原来文件的内容;

(4)把新的内容写进去。

这种方法很简单,下面看一个小例子----文件username里存放了姓名和密码,如下图格式。我们要在所有姓名前加上‘A班_’

因为'A班_'中含有中文,需要叫上encoding='utf-8',否则会出现乱码。

   

2、备份文件的方法

当文件很大时,刚刚的方法在一次性读取文件内容和写入新内容时,耗时长,占用磁盘空间也较大。

备份文件的方法可以建立一个备份文件,修改一行写一行,具体步骤如下:

(1)打开2个文件,原文件a和备份文件b。如a.txt    b.txt.bak

(2)删除a文件,将b文件名改为a文件名

例:将文件words里的“花”改成“flower”

七、小练习

1、产生手机号 前几位一样1861253 后四位随机,写到文件里。

分析:(1)首先要随机产生一些四位数,位数不足的要补0,zfill可以给字符串补0;

(2)需要写到文件里,可以用w或者a模式。文件有打开就要有关闭。

  1. import random
  2. f = open('phones.txt','w')
  3. num = int(input('请输入你要产生的手机号个数:'))
  4. for i in range(num):
  5. start = '1861253'
  6. random_num = str(random.randint(1,9999))
  7. new_num = random_num .zfill(4) #不够4位就补0,仅对字符串可以使用
  8. phone_num = start + new_num
  9. f.write(phone_num+'\n')
  10. f.close()

2、监控服务器日志,如果ip出现的次数大于50次,就把该ip加入黑名单。日志文件的格式如下图

分析:(1)首先,我们应该从日志里提取出所有ip。根据日志文件的格式,我们可以看到每一行的开头是ip,那么可以一行一行的读取数据,然后用空格进行分割,则该行第一个元素就是ip。(2)然后需要统计每一个ip出现的次数,最直接想到的就是count。(3)找到出现次数大于50次的ip,打印出来。

  1. import time
  2.  
  3. point = 0#记录文件指针的位置
  4. while True:
  5. f = open(r'D:\access.log',encoding='utf-8')
  6. all_ips = []
  7. f.seek(point)#移动文件指针,本次接着上次的位置继续读
  8. for line in f:
  9. ip = line.split()[0]#每行第一个元素为IP
  10. all_ips.append(ip)#存放所有的ip,不去重
  11. point = f.tell()# 获取文件当前指针位置
  12. ips_set = set(all_ips)#去重
  13. for i in ips_set:
  14. if all_ips.count(i)>50:
  15. print('应该加入黑名单的ip是:%s\n'%i)
  16. time.sleep(60)#暂停60s

运行结果为:

参考:

https://www.runoob.com/python/python-files-io.html

https://www.runoob.com/python/file-methods.html

https://blog.csdn.net/album_gyd/article/details/89630708

https://www.cnblogs.com/wc-chan/p/8085452.html

一、修改原文件方式

  1. 1 def alter(file,old_str,new_str):
  2. 2 """
  3. 3 替换文件中的字符串
  4. 4 :param file:文件名
  5. 5 :param old_str:就字符串
  6. 6 :param new_str:新字符串
  7. 7 :return:
  8. 8 """
  9. 9 file_data = ""
  10. 10 with open(file, "r", encoding="utf-8") as f:
  11. 11 for line in f:
  12. 12 if old_str in line:
  13. 13 line = line.replace(old_str,new_str)
  14. 14 file_data += line
  15. 15 with open(file,"w",encoding="utf-8") as f:
  16. 16 f.write(file_data)
  17. 17
  18. 18 alter("file1", "09876", "python")

二、把原文件内容和要修改的内容写到新文件中进行存储的方式

2.1 python字符串替换的方法,修改文件内容

  1. import os
  2. def alter(file,old_str,new_str):
  3. """
  4. 将替换的字符串写到一个新的文件中,然后将原文件删除,新文件改为原来文件的名字
  5. :param file: 文件路径
  6. :param old_str: 需要替换的字符串
  7. :param new_str: 替换的字符串
  8. :return: None
  9. """
  10. with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
  11. for line in f1:
  12. if old_str in line:
  13. line = line.replace(old_str, new_str)
  14. f2.write(line)
  15. os.remove(file)
  16. os.rename("%s.bak" % file, file)
  17.  
  18. alter("file1", "python", "测试")

2.2 python 使用正则表达式 替换文件内容 re.sub 方法替换

  1. 1 import re,os
  2. 2 def alter(file,old_str,new_str):
  3. 3
  4. 4 with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
  5. 5 for line in f1:
  6. 6 f2.write(re.sub(old_str,new_str,line))
  7. 7 os.remove(file)
  8. 8 os.rename("%s.bak" % file, file)
  9. 9 alter("file1", "admin", "password")

python文件读写及修改的更多相关文章

  1. python文件读写及形式转化和CGI的简单应用

    一丶python文件读写学习笔记 open() 将会返回一个 file 对象,基本语法格式如下: open(filename, mode) filename:包含了你要访问的文件名称的字符串值. mo ...

  2. python 文件读写操作(24)

    以前的代码都是直接将数据输出到控制台,实际上我们也可以通过读/写文件的方式读取/输出到磁盘文件中,文件读写简称I/O操作.文件I/O操作一共分为四部分:打开(open)/读取(read)/写入(wri ...

  3. python新手学习之文件读写之修改

    文件除r.w.a方式打开外,还可以有多种组合方式如r+ w+ a+等多种方式 1.r+ 读写模式介绍,开始读是从一行开始读,写永远从最后开始写(类似于追加) # f = open("test ...

  4. python笔记(三)---文件读写、修改文件内容、处理json、函数

    文件读写(一) #r 只读,打开文件不存在的话,会报错 #w 只写,会清空原来文件的内容 #a 追加写,不会请求,打开的文件不存在的话,也会帮你新建的一个文件 print(f.read()) #获取到 ...

  5. Python 文件读写,条件循环(三次登录锁定账号实例)

    通过文件读写,条件循环相关语法,实现三次登录失败则锁定该账号的功能 需求一 """需求描述: 1.输入正确账号,密码,退出程序 2.登录失败,重新输入账号密码 3.同一账 ...

  6. Python文件读写及网站显示

    一.关于文件读写的笔记 (一) 文件概述 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容 文件都是按照2进制进行存储的,但在表现形式上有2种:文本文件和二进制文件. 1. 文本文件 文本 ...

  7. Python文件读写--错误一

    在学习python的文件读写操作的时候,我遇到了一点麻烦事,觉得可以记录下来,先上代码吧. with open('test.txt') as file: file.write('test') prin ...

  8. 【学习】python文件读写,用with open as的好处,非常好【转载】

    原文链接:http://www.cnblogs.com/ymjyqsx/p/6554817.html 备注:博主还有很多值得学习的笔记,遇到问题可以拜读,非常感谢博主的总结 读写文件是最常见的IO操作 ...

  9. python文件读写,以后就用with open语句

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

随机推荐

  1. 解决umount: /home: device is busy

    取消挂载/home时出现umount: /home: device is busy,        原因是因为有程序在使用/home目录,我们可以使用fuser查看那些程序的进程,        然后 ...

  2. 【JDK】分析 String str=““ 与 new String()

    一.基础概念 为了讲清楚他们的差异,这里先介绍几个概念. 1.1 常量池 所谓常量池:顾名思义就是用来存放一些常量的.该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法, ...

  3. 洛谷P1019——单词接龙(DFS暴力搜索)

    https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...

  4. 剑指offer计划20( 搜索与回溯算法中等)---java

    1.1.题目1 剑指 Offer 07. 重建二叉树 1.2.解法 注释解法. 1.3.代码 class Solution { int[] preorder; HashMap<Integer, ...

  5. Django边学边记——中间件

    特点 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,用于全局修改Django的输入或输出. 每个中间件组件负责做一些特定的功能.中间件全部注册在sett ...

  6. java 小算法

    //鸡兔同笼 20个头 58腿 for(int a=0;a<=20;a++) { int b = 20-a; if((2*b+4*a)==58) { System.out.println(a+& ...

  7. django 高级扩展-中间件-上传图片-分页-富文本-celery

    """ django 高级扩展 一.静态文件 1.css,js,json,图片,字体等 2.配置setting,在最底下设置静态文件目录,写入下面代码 #配置静态文件目录 ...

  8. T183637-变异距离(2021 CoE III C)【单调栈】

    正题 题目链接:https://www.luogu.com.cn/problem/T183637 题目大意 给出\(n\)个二元组\((x_i,y_i)\),求最大的 \[|x_i-x_j|\time ...

  9. P7115-[NOIP2020]移球游戏【构造】

    正题 题目链接:https://www.luogu.com.cn/problem/P7115 题目大意 \(n+1\)个柱子,前面\(n\)个上面各有\(m\)个球,球有\(n\)种颜色,每种\(m\ ...

  10. CF757F-Team Rocket Rises Again【最短路,DAG支配树】

    正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 \(n\)个点\(m\)条边的一张无向图,求删除\(s\)以外的一个点改变\(s\)到最多点的 ...