文件的读、写、对象操作

01 文件的概念

• 计算机的“文件”,就是存储在某种外部存储设备上的一段“数据”;
• 存储设备包括:硬盘、U 盘、移动硬盘、光盘或云盘、网盘等
文件的存储形式;
按文件中数据的组织形式把文件分为文本文件和二进制文件两类。

文本文件:
👉 存储的是“常规字符串”,由若干文本行组成,通常每行以换行符’\n’结尾。
👉 常规字符串是指“记事本”或其他“文本编辑器”能正常显示、编辑。
👉 人类能够直接阅读和理解,如英文字母、汉字、数字字符串。

二进制文件:
👉 对象内容以字节串(bytes)进行存储。
👉 无法用记事本或其他普通字处理软件直接进行编辑。
👉 无法被人类直接阅读和理解,需要使用专门的软件进行解码后读取、显示、修改或执行。
👉 常见的如图形图像文件、音视频文件、可执行文件、资源文件、各种数据库文件、各类office文档等都属于二进制文件。

open() 方法
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

open(file,mode=‘r’,buffering=-1,encoding=None,errors=None,
newline=None, closefd=True, opener=None)

参数说明:

file: 必需,文件路径(相对或者绝对路径)
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf-8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型

mode 参数有:
在这里插入图片描述

02 文件的读取

① read()方法可以从指定文件中读取指定数据,其语法格式如下:文件对象.read([size])
参数size表示设置的读取数据的字节数,若该参数缺省,则一次读取指定文件中的所有数据。

注意:文件指针
文件指针:标记从哪个位置开始读取数据;第一次打开文件时,通常文件指针会指向文件的开始位置;当执行了 read 方法后,文件指针会移动到读取内容的末尾。

f3 = open(r"C:\Users\Desktop\大数据\spark.txt", 'r')  # 以只读的形式打开文件

content1 = f3.read(10)  # 读取文件10个字节
content2 = f3.read(10)  # 读取文件10个字节
content3 = f3.read()  # 读取文件全部内容
content4 = f3.read()

print("第一次读取:",content1)      # 输出读取文件10个字节
print("_"*50)
print("第二次读取:",content2)      # 输出读取文件10个字节
print("*"*50)
print("第三次读取:",content3)      # 读取文件全部内容
print("第四次读取:",content4) 		# 读到文件末尾时,会返回空字符

f3.close()  # 关闭文件
  • read()方法: 默认会把文件的所有内容一次性读取到内存,如果文件太大,对内存的占用会非常严重;

  • readline()方法: readline 方法可以一次读取一行内容,方法执行后,会把文件指针移动到下一行。

# 读取大文件的正确姿势
f = open(r"D:\test\chapter.txt", 'r')  # 以只读的形式打开文件
while True:
    # 读取一行内容
    content = f.readline()  # 读取文件1行内容
    # 判断是否读到内容
    if not content:
        break
    # 每读取一行的末尾已经有了一个 `\n`
    print(content, end="")
f.close()

注意
read( )(参数缺省时)和readlines( ) 方法都可一次读取文件中的全部数据,但这两种操作都不够安全。因为计算机的内存是有限的,若文件较大,read()和readlines()的一次读取便会耗尽系统内存。

为了保证读取安全,通常多次调用read()方法,每次读取size字节的数据。或者使用readline()方法按行读取内容。

文件的写入

文件打开时,模式是 w 或 a

注意:用w模式打开已有文件时,会覆盖文件原有内容

文件对象. write( str )
参数str表示要写入的字符串。若字符串写入成功,write()方法返回本次写入文件的长度。而且write()方法不能自动换行。需要手动的添加“\n”

文件对象. writelines( [str] )
向文件中写入字符串序列。

f = open(r"D:\Java\ff.txt", 'w')  # w:只写模式
f.write("第1行:hello, python\n")
s = "第2行:python is a great language\n"
f.write(s)
f.close()

f = open(r"D:\Java\ff.txt")  # 只读模式
content = f.read()
print(content)
print("*"*50)
f.close()

# (2) writelines():向文件中写入一个字符串列表
f = open(r"D:\Java\ff.txt", "a")  # 追加

ls = ["aa","bb","cc","dd"]
f.writelines(ls)

f.close()

f = open(r"D:\Java\ff.txt")  # 只读模式
content = f.read()
print(content)
f.close()

文件的定位读取

默认情况下,文件的读写都是从文件开始位置进行。Python可以使用一些函数来跟踪文件当前的位置。

tell()方法: 获取文件当前的位置;
seek()方法: 设置当前文件读写位置。

f = open(r"D:\Java\ff.txt")  # 只读模式
content = f.read()
print(content)
print(f.tell())
f.close()

文件对象. seek(offset, from)
offset: 表示偏移量(字节数),即读写位置需要移动的字节数;
from: 表示从哪里开始偏移,0 默认值,表示从开始位置偏移;1表示从当前位置偏移;2 表示文件结尾作为基准进行偏移。

f = open(r"D:\Java\ff.txt")  # 只读模式
content = f.read(10)
print(content)

f.seek(5) 

content = f.read(10)
print(content)
f.close()

**注意:**当文件以文本文件方式打开时,只能默认从文件头计算偏移量。即offset不为零时,from默认为0;若from不为0时,offset参数只能是0;若文件以二进制方式打开时,可以使用上述参数值进行定位

f = open(r"D:\Java\ff.txt","rb")  # 二进制只读模式

content = f.read(10)
print(content)

f.seek(5,1) 

content = f.read(10)
print(content)

f.close()

二进制文件的读写

数据库文件、图像文件、可执行文件、音视频文件、Office文档等等均属于二进制文件。

对于二进制文件,不能使用记事本或其他文本编辑软件进行正常读写,也无法通过Python的文件对象直接读取和理解二进制文件的内容。

要想准确地理解二进制文件内容,需要序列化和反序列化操作。

  1. 序列化:将内存中的数据转成二进制的字节串形式写入文件的过程。
  2. 反序列化:从文件中读出二进制数据转换成正常数据。
  3. 序列化和反序列化要成对出现。(不同模块的序列化协议不一样)

pickle模块

pickle模块实现了数据序列化和反序列化。

pickle模块使用的数据格式是python专用的,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化;

能够把Python对象直接保存到文件,而不须要把他们转化为字符串。

Pickle模块中最常用的函数:
序列化对象:pickle.dump(obj, file)
函数的功能:把数据对象obj进行序列化,并将结果数据流写入到文件对象file中。
反序列化:pickle.load(file)
函数的功能:将file中的对象序列化读出。

import pickle
a = 123
s = "hello,python"
d = ["aa","bb"]
f = (4, 5, 6)
g = {7, 8, 9}
dic = {'a':'apple', 'b':'banana'}
data = [a, s, d, f, g, dic]    #把上面所有存储到date列表中

with open(r"C:\Users\Desktop\大数据\tt1.txt", "wb") as f:
    for item in data:
        pickle.dump(item, f)

with open(r"C:\Users\Desktop\大数据\tt1.txt", "rb") as f:
    for i in range(len(data)):
        x = pickle.load(f)
        print(x)

在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读