博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python学习之==>文件操作
阅读量:5125 次
发布时间:2019-06-13

本文共 3760 字,大约阅读时间需要 12 分钟。

1、打开文件的模式

1 r,只读模式(默认)【不可写;文件不存在,会报错】2 w,只写模式【不可读;不存在则创建;存在则删除内容】3 a,追加模式【不可读;不存在则创建;存在则追加内容】4 r+,读写模式【可读、可写、可追加,如果打开的文件不存在的话,会报错】5 w+,写读模式【使用w+的话,已经存在的文件内容会被清空,可以读到已经写的文件内容】6 a+,追加读写模式【不存在则创建;存在则只追加内容;】

2、文件基本操作

1 # 打开文件(python默认字符集为utf-8,windows为gbk,所以要指定encoding='utf-8'),不输入模式默认为r模式2 m = open('words',encoding='utf-8')3 print(m.read())        # 读文件4 print(m.readline())    # 读取第一行5 print(m.readlines())   # 把文件的每一行放到一个list里面

3、文件操作方法

1 f = open('words','r+',encoding='utf-8')  # encoding参数可以指定文件的编码 2 f.readline()  # 读一行 3 f.readable()  # 判断文件是否可读 4 f.writable()  # 判断文件是否可写 5 f.encoding    # 打印文件的编码 6 f.read()      # 读取所有内容,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆 7 f.readlines() # 读取所有文件内容,返回一个list,元素是每行的数据,大文件时不要用,原因和上面一样 8 f.tell()      # 获取当前文件的指针指向 9 f.seek(0)     # 把当前文件指针指向哪10 f.write('爱情证书') # 写入内容11 f.flush()     # 写入文件后,立即从内存中把数据写到磁盘中12 f.truncate()  # 清空文件内容13 f.writelines(['爱情证书','孙燕姿']) # 将一个列表写入文件中14 f.close()     # 关闭文件

4、大文件读取高效操作方法

用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放了,如下:

1 # 这样的话,line就是每行文件的内容,读完一行的话,就会释放一行的内存2 f = open('words',encoding='utf-8')3 for line in f:4     print(line)

5、文件指针

1 # 用来记录文件读到哪里2 # a模式的文件指针是在末尾的3 m = open('name','a+',encoding='utf-8')4 m.write('呃呃呃')5 m.seek(0)          # 移动文件指针到最前面6 print(m.read())7 m.write('呵呵呵')  # 移动完文件指针之后,从前面开始读,但写的时候还是在文件末尾写8 m.seek(0)9 print(m.read())

6、自动关闭文件

在操作文件的时候,经常会忘了关闭文件。可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件,使用方式如下:

1 # 打开一个文件,把这个文件的句柄付给f2 with open('file.txt', 'r') as f:3     for line in f:4         print(line)5         6 # 这是多文件的操作,打开两个文件,fr是读file.txt,fw是新建一个file_bak文件7 with open('file.txt') as fr,open('file_bak', 'w') as fw:8     for line in fr:     # 循环file.txt中的每一行9         fw.write(line)  # 写到file_bak文件中

7、修改文件

修改文件有两种方式:

  • 一种是把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容
  • 第二种是把修改后的文件内容写到一个新的文件中

第一种方式:

1 with open('words','r+',encoding='utf-8') as fr:2     res = fr.read()    # 读出文件中的全部内容3     new_res = res.replace('花','flower')  # 将'花'替换成'flower'4     fr.seek(0)         # 将文件指针指向文件最开头5     fr.truncate()      # 清空文件6     fr.write(new_res)  # 将替换后的内容写入文件

第二种方式:

1 # 这个是多文件的操作,打开两个文件,fr是读file.txt,fw是新建一个file_bak文件2 import os3 with open('file') as fr,open('new_file','w') as fw:4     for line in fr:  # 循环file.txt中的每一行5         new_line = line.replace('花','flower')6         fw.write(new_line) # 写到file_bak文件中7         os.remove('file')  # 删除文件8         os.rename('new_file','file') # 改名

8、f.write()和f.writelines()

1 # f.write()只能写字符串 2 a = ['abc\n','123\n','!@#'] 3 f = open('name','w') 4 for i in a: 5     f.write(i) 6  7 # f.writelines()会循环把list当中的元素写入文件 8 a = ['abc\n','123\n','!@#'] 9 f = open('name','w')10 f.writelines(a)

9、练习

(1)随机产生手机号,输入多少个就产生多少个

import randomstart_num = '1387691'f = open('test.txt','w',encoding='utf-8')num = input('请输入要产生的手机号个数:')for i in range(int(num)):    random_num = str(random.randint(1,9999))   # 随机产生一个1-9999的数字    new_num = random_num.zfill(4)              # 不够四位,前面补0    phone_num = start_num + new_num    f.write(phone_num + '\n')f.close()

(2)监控日志,一分钟读一次日志文件,如果一分钟之内访问博客的IP地址超过50次,就把这个IP记录下加入黑名单

1 # 分析: 2     #打开日志文件 3     #把ip地址拿出来 4     #判断每一个ip出现的次数,如果大于50次,记录下来,加入黑名单 5     #每分钟读一次 6 import time 7 point = 0 8 while True: 9     all_ips = []             #存放所有的IP地址10     f = open('access.log',encoding='utf-8')11     f.seek(point)            #移动文件指针12     for line in f:           #直接循环一个文件对象,每次循环的是文件的一行13         ip = line.split()[0] #拿到IP地址14         all_ips.append(ip)   #把它存入数组当中15     point = f.tell()         #记录指针位置16     all_ip_set = set(all_ips)17     for ip in all_ip_set:    #循环集合当中的IP,没有重复的18         if all_ips.count(ip) > 50:  #判断的是数组当中的IP19             print('攻击的ip是:%s'%ip)20     f.close()21     time.sleep(2)

转载于:https://www.cnblogs.com/L-Test/p/8983190.html

你可能感兴趣的文章
Docker 查看镜像信息
查看>>
WPF 绑定StaticResource到控件的方法
查看>>
Creating a Pulsing Circle Animation
查看>>
Docker最全教程——从理论到实战(八)
查看>>
WPF 蒙罩层 LoadingPage
查看>>
SQLServer日期格式化
查看>>
Android项目实战(二十二):启动另一个APP or 重启本APP
查看>>
VS生成Cordova for Android应用之Gradle
查看>>
ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区...
查看>>
VSTO 得到Office文档的选中内容(Word、Excel、PPT、Outlook)
查看>>
Ubuntu 14.04 LAMP搭建(Apache 2.47+MySQL 5.5+PHP5.5)
查看>>
使用.net备份和还原数据库
查看>>
ActiveReports 报表控件官方中文入门教程 (2)-创建、数据源、浏览以及发布
查看>>
asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)...
查看>>
一些有用的javascript实例分析(二)
查看>>
Android_Kotlin 代码学习
查看>>
关于android:windowNoTitle不起作用的解决办法
查看>>
关于使用Transaction对于非数据库事务的操作
查看>>
私钥公钥学习心得(二)比特币与支付宝
查看>>
瀑布流插件|jquery.masonry|使用demo
查看>>