目录
open(filename[,moding,encoding])
一、IO
IO即 input 与 output ,数据就如水流在水管中流向磁盘(类似队列,先进先出)
二、操作
Python解释器在运行.py文件时用到操作系统(OS)及其资源,.py文件里的代码就是通过调用才做系统操作磁盘上的文件(及读写磁盘里的文件)
(一)操作流程:
1.打开或创建:
打开:读取已有(文件->程序)
创建:将数据写入新文件(程序->文件)
2.打开和关闭系统资源
在操作文件时会调用操作系统资源,在操作完文件后记得关闭
三、文件打开模式
这里的b通常用于与r、w一起使用读写操作图片、视频等
四、操作文件对象常用方法
open(filename[,moding,encoding])
可用于打开文件(记得close())
- filename:文件名
- moding:打开模式(默认只读)
- encoding:系统中默认文本文件字符编码格式为gbk,而 Python 中编译默认编码格式为UTF-8,有中文时记得设置编码
with xxx as name:
with可以管理上下文资源,无论什么原因跳出该模块,系统资源都将自动关闭,达到释放资源的目的
这里的xxx称为上下文表达式,结果为上下文管理器
解释:一个类对象实现了__enter__()与__exit__()方法,则这个类对象遵守了上下文协议,该类的实例对象就是上下文管理器,如下图的 open() 就是上下文管理器,with 缩进内的都为 with 语句体
执行的顺序:调用执行__enter__方法 --> 调用执行 with 语句体 --> 调用执行__exit__方法,无论是否产生异常都会调用两个方法,__exit__进行退出后会自动关闭资源
五、文件操作的实例
现有一 .txt 文件,一共有28万多条数据,我希望将每两万行读取数据并写入到一个新文件中,表格其实可以使用 pandas 和 xlwings 库,但是发现自己的电脑只有WPS,不兼容的问题还不知道怎么解决,所以只好用这种方法了
(一)分析
首先是将原文件读取,写入到目标文件,有28万多条数据,就需要创建15个文件进行写入,这可以通过循环是实现
(二)步骤
1.读取
import math
# 文件数量需要向上取整
# 只读,内部有中文,使用gbk编码模式
with open(r'C:\Users\yysc\Desktop\会员群组会员卡号导入.txt',mode='r',encoding='gbk') as src_file:
tel_list=src_file.readlines()
print(tel_list)
# print(math.ceil(len(tel_list)/20000))
可以得到一个列表:
2.写入
table=0 # 用于赋给表名
location=1 # 用于遍历列表元素逐条写入
for i in range(0,math.ceil(len(tel_list)/20000)): # 长度/20000向上取整
table+=1 # 第一张表开始
with open(r'C:\Users\yysc\Desktop\会员电话卡号%s.txt'% table,'w',encoding='gbk') as target_file:
target_file.write('会员卡号\n')
for k in range(0, 20000): # 这里注意细节,有一次只有19999条数据
target_file.write(tel_list[location])
print(location) # 只是看看循环次数
location+=1
这里使用了 location 变量结合循环来遍历列表并写入对应文件,列表的第一个元素是字符'会员卡号',为了简便我直接从第一个号码开始遍历,然后在循环里加上该表头
操作成功(虽然会报错,不过应该是因为最后一个表没有20000条数据报了索引的错误,核对后并不影响写入的结果)