python——文件操作
放寒假了,在家没事就复习一下之前学的python,就当做记笔记吧,也加深一下印象,分享出来也希望可以帮助大家。
今天我看了文件方面的内容,就分享一下我复习到的知识点吧!
首先是相关的模块操作,我就写下来吧:
上面是会在文件操作当中用到的一些模块,下面我们就进行相关文件的一系列操作吧!
一:文件打开、关闭;
open()函数用于创建文件对象,基本语法格式如下:
open(文件名[,打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比 如:D:\a\b.txt。为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。示例如下:
f = open(r"d:\b.txt",“w”)
打开方式有如下几种:
模式 描述
r :读 read 模式
w: 写 write 模式。如果文件不存在则创建;如果文件存在,则重写新内容;
a “”追加 append 模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容
b :二进制 binary 模式(可与其他模式组合使用)
+: 读、写模式(可与其他模式组合使用)
比如下面的例子:
#文件打开关闭和写入
#f = open(r"d:\a.txt","a")
f = open(r"a.txt","a")
f.write("itbaizhan\nsxt\n")
f.close()#关闭文件
当然这只是其中一种方式,还有另外一种方式:
with open(r"sqoop.txt","r",encoding="utf-8") as f:
pass
pass里面的内容就和上面差不多了。
二:文本文件的写入;
文本文件的写入一般就是三个步骤:
1. 创建文件对象
2. 写入数据
3. 关闭文件对象
在python文件处理中有两个写入方法:write()/writelines()写入数据
write(a):把字符串 a 写入到文件中
writelines(b):把字符串列表写入文件中,不添加换行符
下面我们进行代码演示
# 写入中文测试
#f = open(r"d:\a.txt","a")
# 打开文件
f = open(r"b.txt","a")
# 写入文件内容,内容为中文,内容就随便了吧,哈哈哈
f.write("你对比上快点上藕I山东航空年代初看见啊讲3\n我爱中国\n")
# 关闭文件
f.close()
结果·如下
在写入中文时可能乱码这时候我们可以在打开文件的时候规定编码格式;
f = open(r"b.txt","a",encoding='utf-8')
# 写入文件内容,内容为中文
f.write("你对比上快点上藕I山东航空年代初看见啊讲3\n我爱中国\n")
# 关闭文件
f.close()
这样子基本上就不会出错了;下面我们进行writelines()的测试:
f = open(r"bb.txt","w",encoding="utf-8")
s = ["张三\n","李四\n","王二麻子\n"]
f.writelines(s)
f.close()
上面测试结果当中出现了换行,这是因为我们在代码处理当中加入了换行处理“\n”,writelines()方法本身是不具备换行功能的。
三:文件读取;
文件的读取一般使用如下三个方法:
- read([size])
从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。
读取到文件末尾,会返回空字符串。 - readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。 - readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表
下面我们来进行逐个测试:
reade():
# read()读取全部文本内容,read(num)num表示数字,表示读取文件开始到多少个字节结束
with open(r"sqoop.txt","r",encoding="utf-8") as f:
data=f.read()
print(data)
测试结果:
readeline():
with open(r"sqoop.txt","r",encoding="utf-8") as f:
data1=f.readline()
print(data1)
print("*"*30)
# 使用for循环读取全部内容
with open(r"sqoop.txt","r",encoding="utf-8") as f:
for data2 in f:
print(data2,end="")
readlines()
# readlines()文本文件中,每一行作为一个字符串存入列表中,返回该列表
with open(r"sqoop.txt","r",encoding="utf-8") as f:
data3=f.readlines()
# print(data3)
# 返回行号
for data4 in data3:
print(data3.index(data4)+1,data4,end="")
# 使用enumerate,enumerate多用于在for循环中得到计数,利用它可以同时获得索引和值,即需要index和value值的时候可以使用enumerate,其中start参数可以决定行数起始位置
with open(r"sqoop.txt","r",encoding="utf-8") as f:
data3=f.readlines()
for index,data4 in enumerate(data3,start=1):
print(index,data4,end="")
以上关于readlines()的测试中用到了enumerate(),enumerate()是python的内置函数、适用于python2.x和python3.x,enumerate在字典上是枚举、列举的意思。enumerate参数为可遍历/可迭代的对象(如列表、字符串),enumerate多用于在for循环中得到计数,利用它可以同时获得索引和值,即需要index和value值的时候可以使用enumerate。enumerate()返回的是一个enumerate对象
例如:
lst = [1,2,3,4,5,6]
for index,value in enumerate(lst,1):
print (index,value)
四:二进制文件的读取与写入;
二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。例如
f = open(r"d:\a.txt", ‘wb’) #可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", ‘ab’) #可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", ‘rb’) #可读的二进制文件对象
下面我们以一个图片的copy为例:
# 打开文件test.jpg
with open(r'./test.jpg','rb') as f:
# 创建copy文件test_copy.jpg
with open(r'./test_copy.jpg','wb') as w:
# 以下是两种读取和写入方式
# for line in f.readlines():
# w.write(line)
data=f.read()
w.write(data)
w.close()
f.close()
#关闭文件
copy之后的图片
这样子一张图片就copy完成了。
五:文件操作常用方法;
方法 | 作用 |
---|---|
read([size]) | 从文件中读取 size 个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容 |
-write(str)- | -将字符串 str 内容写入文件- |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
–writelines(s) | -将字符串列表 s 写入文件文件,不添加换行符- |
seek(offset,[whence]) | 把文件指针移动到新的位置,offset 表示相对于 whence 的多少个字节的偏移量;offset:off 为正往结束方向移动,为负往开始方向移动whence 不同的值代表不同含义:0: 从文件头开始计算(默认值)1:从当前位置开始计算2:从文件尾开始计算 |
tell() | 返回文件指针的当前位置 |
-truncate([size])- | -不论指针在什么位置,只留下指针前 size 个字节的内容,其余全部删除;如果没有传入 size,则当指针当前位置到文件末尾内容全部删除- |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源 |
以上是我总结的内容,请大家指教;
六:使用 pickle 序列化
Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。我们可以使用 pickle 模块中的函数,实现序列化和反序列操作。序列化我们使用:
pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对象
# 导入模块
import pickle
with open(r"./data.dat","wb") as f:
a1 = "张三"
a2 = 234
a3 = [20,30,40]
pickle.dump(a1,f)
pickle.dump(a2, f)
pickle.dump(a3, f)
# 反序列化
with open(r"d:\data.dat","rb") as f:
a1 = pickle.load(f)
a2 = pickle.load(f)
a3 = pickle.load(f)
print(a1)
print(a2)
print(a3)
打开保存的文件是以下内容:
控制台输出如下:
六:序列化和反序列化;
Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。我们可以使用 pickle 模块中的函数,实现序列化和反序列操作。序列化我们使用:
pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对象
下面是具体实例代码:
# 导入模块
import pickle
with open(r"./data.dat","wb") as f:
a1 = "张三"
a2 = 234
a3 = [20,30,40]
pickle.dump(a1,f)
pickle.dump(a2, f)
pickle.dump(a3, f)
# 反序列化
with open(r"d:\data.dat","rb") as f:
a1 = pickle.load(f)
a2 = pickle.load(f)
a3 = pickle.load(f)
print(a1)
print(a2)
print(a3)
载入文件中结果如下:
控制台结果如下:
七:CSV文件读取与写入
csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel
文件和数据库数据的导入和导出。与 Excel 文件不同,CSV 文件中:
值没有类型,所有值都是字符串
不能指定字体颜色等样式
不能指定单元格的宽高,不能合并单元格
没有多个工作表
不能嵌入图像图表
下面我将代码实例写过来:
# 导入CSV模块
import csv
student_infos = []
with open(r'./成绩详细.csv','r',encoding='utf-8' ) as file:
f_csv = csv.reader(file)
# 单独读取表头行
header = next(f_csv)
for row in f_csv:
# 处理学生实际数据,构建成字典
student_info = {}
for index in range(6):
student_info[header[index]] = row[index]
student_infos.append(student_info)
student_list=student_infos
print(student_list)
读取的文件内容如下:
这里有点私人信息就摸红了吧!哈哈哈
下面我们来测试文件写入:
import csv
headers = ["工号","姓名","年龄","地址","月薪"]
rows = [("100100","张三",18,"西三旗 1 号院","50000"),("1002100","李四",19,"西三旗 1 号院","30000")]
with open(r"./b.csv","w") as b:
b_csv = csv.writer(b) #创建 csv 对象
b_csv.writerow(headers) #写入一行(标题)
b_csv.writerows(rows) #写入多行(数据)
测试结果如下:
以上就是我今天复习的python相关文件内容了,分享给大家一起查漏补缺。当然,内容不是很全,如果有错的地方请大家多多指教。感谢!!!