20文件

摘要:
文件指针(知道)当文件指针标记第一次读取数据的位置时,文件指针通常指向文件的开头。当执行读取方法时,文件指针将移动到读取内容的末尾。默认情况下,它将移动到文件的末尾。如果read方法被执行一次,并且所有内容都被读取,那么再次调用read方法仍然可以获得内容吗?

 

1. 文件的概念


1.1 文件的概念和作用

  • 计算机的 文件, 就是存储在某种 长期储存设备 上的一段 数据
  • 长期储存设备包括: 硬盘,U盘,移动硬盘,光盘...

文件的作用

将数据长期保持下来, 在需要的时候使用

1.2 文件的储存方式

  • 在计算机中, 文件是以 二进制 的方式保持在磁盘上的

文本文件和二进制文件

  • 文本文件

    可以使用 文本编辑软件 查看

    本质上是二进制文件

    例如: python 的源程序
  • 二进制文件

    保存的内容 不是给人直接阅读的, 二十 提供给其他软件使用的

    例如: 图片文件, 音频文件, 视频文件等等

    二进制文件不能使用 文本编辑软件 查看

2. 文件的基本操作


2.1 操作文件的套路

在 计算机 中要操作文件的套路非常固定, 一共包含三个步骤:

  1. 打开文件
  2. 读, 写 文件

    读 将文件内容读入内存

    写 将内存内容写入文件
  3. 关闭文件

2.2 操作文件的函数 / 方法

  • 在 Python 中要操作文件需要记住 1 个函数和 3 个方法
序号函数 / 方法说明
1open打开文件, 并且返回文件操作对象
2 read将文件内容读取到内存
3write将指定内容写入文件
4close关闭文件
  • open 函数负责打开文件, 并且返回文件对象
  • read / write / close 三个方法都需要通过 文件对象 来调用

2.3 read 方法 ---- 读取文件

    • open 函数的第一个参数是要打开的文件名

      如果文件 存在, 返回 文件操作对象

      如果文件 不存在, 抛出异常
    • read 方法可以一次性 读入 返回 文件的 所有内容
    • close 方法赋值 关闭文件 (ps : 如果忘记关闭文件, 会造成系统资源消耗, 而且会影响到后续对文件的访问)
    • 注意: 方法执行后, 会把 文件指针 移动到 文件的末尾
1 # 1. 打开文件
2 file = open("README")
3 
4 # 2. 读取文件内容
5 text = file.read()
6 print(text)
7 
8 # 3. 关闭
9 file.close()

提示

  • 在开发中, 通常会先编写 打开 关闭 的代码, 再编写中间针对文件的 读 / 写 操作!

文件指针 (知道)

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

    默认情况下会移动到 文件末尾

思考

  • 如果执行了一次 read 方法, 读取了所有内容, 那么再次调用 read 方法, 还能够获得到内容吗?

答案

  • 不能
  • 第一次读取之后, 文件指针移动到了文件末尾, 再次调用不会读取到任何的内容

2.4 打开文件的方式

  • open 函数默认以 只读方式 打开文件, 并且返回文件对象

语法如下 : 

f = open("文件名", "访问方式")
访问方式说明
r只读 方式打开文件. 文件的指针将会放在文件的开头, 这是 默认模式. 如果文件不存在, 抛出异常
w

只写 方式打开文件. 如果文件存在会被覆盖. 如果文件不存在, 创建新文件

a追加 方式打开文件. 如果该文件已存在, 文件指针将会放在文件的结尾. 如果文件不存在, 穿件新文件进行写入
r+

读写 方式打开文件, 文件的指针将会放在文件的开头. 如果文件不存在, 抛出异常

w+读写 方式打开文件, 如果文件存在会被覆盖. 如果文件不存在, 创建新文件
a+读写 方式打开文件. 如果该文件已存在, 文件指针将会放在文件的结尾, 如果文件不存在,创建新文件进行写入

提示

  • 频繁的移动文件指针, 会影响文件的读写效率, 开发中更多的时候会以 只读, 只写 的方式来操作文件

2.5 按行读取文件内容

  • read 方法默认会把文件的 所有内容 一次性读取到内存
  • 如果文件太大, 对内存的占用会非常严重

readline方法

  • readline 方法可以一次读取一行内容
  • 方法执行后, 会把 文件指针 移动到下一行, 准备再次读取

读取大文件的正确姿势

 1 # 1. 打开文件
 2 file = open("README")
 3 
 4 # 2. 读取文件内容
 5 while True:
 6     text = file.readline()
 7 
 8     #  判断时候有内容
 9     if not text:
10         break
11     print(text)
12 
13 # 3. 关闭
14 file.close()

2.6 文件读写案例 ---- 复制文件

小文件复制

  • 打开一个已有文件, 读取完整内容, 并写入到另一个文件
 1 # 1. 打开文件
 2 file = open("README")
 3 file2 = open("README2", "w")
 4 
 5 # 2. 读, 写文件内容
 6 text = file.read()
 7 file2.write(text)
 8 
 9 # 3. 关闭
10 file.close()
11 file2.close()

大文件复制

  • 一行一行读, 写
 1 # 1. 打开文件
 2 file = open("README")
 3 file2 = open("README2", "w")
 4 
 5 # 2. 读, 写文件内容
 6 while True:
 7     # 读取一行内容
 8     text = file.readline()
 9     # 判断时候读取到内容
10     if not text:
11         break
12     # 每次写入文件指针会到文件的末尾
13     file2.write(text)
14 
15 # 3. 关闭
16 file.close()
17 file2.close()

3. 文件 / 目录的常用管理操作


  • 终端 / 文件浏览器, 中可以执行常规的 文件 / 目录 管理操作
  • 在 Python 中, 如果希望通过程序实现上述功能, 需要导入 os 模块

略 ...

4. 文件文本的编码格式

  • 文本文件存储的内容是基于 字符编码 的文件, 常见的编码有 ASCII 编码 , UNICODE 编码等

Python 2.x 默认使用 ASCII 编码

Python 3.x 默认使用 UTF-8 编码

4.1 ASCII 编码 和 UNICODE 编码

ASCII 编码

  • 计算机中只有 256 个ASCII 编码
  • 一个 ASCII 在内存中占用 1个字节 的空间

UTF-8 编码

  • 计算机中使用 1-6 个字节 来表示一个 UTF-8 字符, 涵盖了 地球上几乎所有地区的文字
  • 大多数汉子会使用 3个字节 表示
  • UTF-8 是 UNICODE 编码的一种编码格式

免责声明:文章转载自《20文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇zookeeper安装以及遇到的一些坑linux笔记1(创建用户、安装gcc、安装五笔输入法)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

NumPy位操作

NumPy - 位操作 下面是 NumPy 包中可用的位操作函数。 序号 操作及描述 1. bitwise_and对数组元素执行位与操作 2. bitwise_or对数组元素执行位或操作 3. invert计算位非 4. left_shift向左移动二进制表示的位 5. right_shift向右移动二进制表示的位...

PCIe Max_Payload_Size 和 Max_Read_Request_Size

最近PCIe在SSDFans上镜率挺高,那我们来聊两句MAX_READ_REQUEST_SIZE 和MAX_PAYLOAD_SIZE。 这两个东西都在PCIe Capability Structure 08h (Device Control Register)里 Maximum Payload Size (简称MPS) 控制一个TLP可以传输的最大数据长...

链表面试题

1、逆置链表 假设链表现在是 4->3->2->1->NULL逆置后的链表是 1->2->3->4->NULL步骤:第一步:先把4用临时指针tmp保存起来,cur指向下一个节点,即cur指向3 第二步:令tmp指向newNode,4是第一个节点,则4的next为NULL,即令tmp->next =ne...

SetFilePointer 使用

今天在使用SetFilePointer 的时候出现了溢出的问题,使用了SetFilePointerEx,出现了指针错位的问题,其实只要设置LONGLONG64位,然后分别设置SetFilePointer 的高低位不会出现溢出的问题 下面是转的一篇使用这个接口的博文 DWORD SetFilePointer(   HANDLE hFile,   LONG...

GB2312编码(为什么要加2020H、8080H,外码→内码→交换码→字形码)

为什么要加上2020H和8080H? 区位码、内码、国标码怎么转换非常简单,但是令人迷惑的是为什么要那么转换?这种转换不可能平白无故地那样转换! 我搜索很多资料,找到最好的解释,总结如下: 首先,注意到一点,GB2312虽说是对中文编码,但是里面有对26个英文字母和一些特殊符号的编码,按理说这和ASCII重合的部分应该无需设置,沿用ASCII中不就行了?但...

双指针应用一:碰撞指针

1、翻转数组中的元素:s = ['l', 'e', 'e', 't', 'c', 'o', 'd', 'e'] 算法思路:定义左指针 i=0, 右指针 r = len(s)-1。交换指针对应的元素,然后同时向中间移动指针,直到指针碰撞。在指针移动的同时,交换指针指代的元素。 def reverseStr(s): l=0 r=len(s)-1...