05 python开发之文件处理

5 文件处理

5.1 字符编码

5.1.1 基本概念

  • 字符编码

    文字符号-----------------编码----------------->数字

    文字符号<----------------编码------------------数字

  • 字符编码表:一个字符对应一个数字

  • 研究字符编码表是为了解决乱码问题

    存取都用同一张字符编码表

  • 储备知识:CPU、内存、硬盘

  • 运行python程序的三个阶段

    Ⅰ 先启动一个python解释器

    Ⅱ python解释器会将文件内容从硬盘读入内存

    Ⅲ python解释器会解释执行刚刚读入内存的代码,识别语法

    x = "你好Hello"

5.1.2 发展历程

  • 一家独大

    ASCⅡ:只能识别英文字符,用8个bit对应一个英文字符

  • 天下大乱

    GBK:能识别中文和英文,用16个bit(2Bytes)对应一个字符

    shift-JIS

    Euc-KR

  • 归于统一

    unicode:能识别万国字符,常用16bit(2Bytes)对应一个字符

5.1.3 使用

  • part1

​ 英文字符------->内存(ASCⅡ格式的二进制数)---->硬盘(ASCⅡ格式的二进制数)

中文、英文字符------->内存(GBK格式的二进制数)----->硬盘(GBK格式的二进制数)

日文、英文字符--->内存(shift-JIS格式的二进制数)--->硬盘(shift-JIS格式的二进制数)

​ 万国字符----->内存(Unicode格式的二进制数)---->硬盘(utf-8格式的二进制数)

  • part2
字符-------->unicode格式的二进制(内存)---------------->utf-8格式的二进制(硬盘)
编码 编码
字符<--------unicode格式的二进制(内存)<----------------utf-8格式的二进制(硬盘)
解码 解码 x = "上"
print(x) # 打印unicode相当于打印字符 utf8_res = x.encode("utf-8")
# print(utf8_res, type(utf8_res)) # b'\xe4\xb8\x8a' <class 'bytes'>
unicode_res = utf8_res.decode("utf-8")
print(unicode_res)

5.2 文件处理基础

5.2.1 基本概念

  • 文件是操作系统提供给用户/应用程序存取硬盘的一种机制

  • 文件可以永久保存数据

  • 如何使用文件

    应用程序 open()

    操作系统 文件

    计算机硬件(硬盘)

5.2.2 操作文件的步骤

  • rawstring原生路径

    f = open(r'文件绝对路径/相对路径')

    f的值,文件对象/文件句柄

  • data = f.read()

    print(data)

  • f.close() # 回收系统资源

5.2.3 with上下文管理

with open(r'绝对路径或相对路径') as f1,\
open(r'绝对路径或相对路径') as f2:
f1.read()
f2.read() with open(r'第二周计划', "rt", encoding='utf-8') as f1:
data = f1.read()
print(data)
f1.close()
data = f1.read()
print(data)

5.3 文件打开模式

5.3.1 控制读写操作模式

  • r : 只读(默认)
  • w : 只写
  • a : 只追加写

5.3.2 控制读写内容的模式

  • t : 读写都是文本格式,即读写都是用字符串(默认)
  • b : 读写都是bytes格式,bytes等同于二进制

强调:如果是t模式,一定要加上encoding="编码格式"

​ 如果是b模式,一定不可以加上encoding="编码格式"

5.3.3 常规使用

  • r:在文件存在的时候,文件指针调到文件的开头,文件不存在直接报错
r:在文件存在的时候,文件指针调到文件的开头,文件不存在直接报错
f = open("a.txt", mode="rt", encoding="utf-8")
res = f.read()
print(res)
f.close()
  • w:在文件存在的时候会清空文件,指针调到文件开头,文件不存在会创建空新文件
w:在文件存在的时候会清空文件,指针调到文件开头,文件不存在会创建空新文件
f = open("a.txt", mode="wt", encoding="utf-8")
f.write("你好\n666")
f.close()
  • a:在文件存在的时候不会清空文件,指针跳到文件末尾,文件不存在会创建空新文件
a:在文件存在的时候不会清空文件,指针跳到文件末尾,文件不存在会创建空新文件
f = open("a.txt", mode="at", encoding="utf-8")
f.write("\n777")
f.close()
  • rb wb ab
rb wb ab
f = open("a.txt", mode="rb")
res = f.read()
print(res)
print(res.decode("utf-8"))
f.close() f = open("a.txt", mode="wb")
f.write("你好".encode('utf-8'))
f.close()
  • 图片、视频等非文本文件只能用b模式
with open(r'H:\BaiduNetdiskDownload\Linux阶段总结\img\day004主板.png', mode='rb') as f1,\
open(r'C:\Users\曹嘉鑫\Desktop\1111.png', mode='wb') as f2:
# res = f1.read()
# f2.write(res)
for line in f1:
f2.write(line)

5.3.4 拓展功能

with open('a.txt', mode='r+t', encoding='utf-8') as f:
print(f.read())
print(f.writable())
print(f.readable())
f.write("你好") with open('a.txt', mode='w+t', encoding='utf-8') as f:
print(f.writable())
print(f.readable())
f.write("你好")
res = f.read()
print("===> %s" % res) with open('a.txt', mode='a+t', encoding='utf-8') as f:
print(f.writable())
print(f.readable())
print(f.read()) f.flush()
print(f.name)
print(f.encoding)

5.4 文件处理的其他办法

5.4.1 读操作

with open('a.txt', mode='rt', encoding='utf-8') as f:
line1 = f.readline()
print(line1)
line2 = f.readline()
print(line2) for line in f:
print(line) lines = f.readlines()
print(lines)

5.4.2 写操作

with open('a.txt', mode='wt', encoding='utf-8') as f:
f.write("1111\n2222\n3333\n") for x in "hello":
f.write(x) f.writelines("hello") # f.write("hello") f.writelines(["111", "222", "333"])
f.writelines(["111\n", "222\n", "333\n"])

5.5 控制指针移动

5.5.1 重要概念

  • 文件内指针移动,除了t模式下的read(n)中n代表的是字符个数
  • 其他都是以bytes为单位的
with open('a.txt', mode='rt', encoding='utf-8') as f:
res = f.read(6)
print(res) with open('a.txt', mode='rb') as f:
res = f.read(8)
print(res)
print(res.decode('utf-8')) with open('a.txt', mode='r+', encoding='utf-8') as f:
f.truncate(8)

5.5.2 f.seek()

  • f.seek(移动的字节个数,模式)

  • 三种模式

    0 : 参照文件开头移动指针

    1 : 参照当前所在的位置移动指针

    2 : 参照文件末尾位置移动指针

  • 只有0模式可以在t下使用

  • 1和2只能在b下使用

只有0模式可以在t下使用,1和2只能在b下使用
with open('a.txt', mode='a+b') as f:
print(f.tell()) # 查看指针在文件的第几个字节 with open('a.txt', mode='r+b') as f:
f.seek(0, 2)
print(f.tell()) with open('a.txt', mode='a+b') as f:
f.seek(-6, 2)
# print(f.read().decode('utf-8'))
print(f.read(3).decode('utf-8')) import time with open('a.txt', mode='rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
time.sleep(0.1)
else:
print(line.decode('utf-8'), end="")

5.6 文件修改的两种方式

# 方式一:
# 1、以r模式打开源文件,将源文件内容全部读入内存
# 2、在内存中修改完毕
# 3、以w模式打开源文件,将修改后的内容写入源文件
# 优点:不必大量占用硬盘资源
# 缺点:耗内存,需要足够的内存空间 with open('a.txt', mode='rt', encoding='utf-8') as f1:
data = f1.read()
res = data.replace('hello', '早上好')
with open('a.txt', mode='wt', encoding='utf-8') as f2:
f2.write(res) # 方式二:
# 1、以r模式打开源文件,然后以w模式打开一个临时文件
# 2、从源文件中读一行到内存中,修改完毕后直接写入临时文件,循环往复直到操作完毕所有行
# 3、删除源文件,将临时文件名改为源文件名
# 优点:没有对内存造成过度的占用
# 缺点:需要硬盘预留出足够的空间来存放临时文件 import os
with open('a.txt', mode='rt', encoding='utf-8') as src_f,\
open('.a.txt.swp', mode='wt', encoding='utf-8') as dst_f: for line in src_f:
dst_f.write(line.replace('你好', 'Hello')) os.remove('a.txt')
os.rename('.a.txt.swp', 'a.txt')

05 python开发之文件处理的更多相关文章

  1. python开发_python文件操作

    关于python文件操作的详细说明,大家可以参考:关于python的文件操作 官方API:os-Miscellaneous operating system interfaces 下面是我做的demo ...

  2. Python开发——6.文件操作

    一.文件操作 1.文件操作的处理流程 打开文件得到文件句柄并赋值给一个变量====>通过句柄对文件进行分析====>关闭文件 #1. 打开文件,得到文件句柄并赋值给一个变量 f=open( ...

  3. Python 开发轻量级爬虫05

    Python 开发轻量级爬虫 (imooc总结05--网页下载器) 介绍网页下载器 网页下载器是将互联网上url对应的网页下载到本地的工具.因为将网页下载到本地才能进行后续的分析处理,可以说网页下载器 ...

  4. python开发学习-day01 (python安装与版本、字符串、字典、运算符、文件)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. python开发_thread_线程_搜索本地文件

    在之前的blog中,曾经写到过关于搜索本地文件的技术文章 如: java开发_快速搜索本地文件_小应用程序 python开发_搜索本地文件信息写入文件 下面说说python中关于线程来搜索本地文件 利 ...

  6. Python开发(二):列表、字典、元组与文件处理

    Python开发(二):列表.字典.元组与文件处理 一:列表二:元组三:字典四:文件处理 一:列表   为什么需要列表 可以通过列表可以对数据实现最方便的存储.修改等操作.字符串是不能修改的,所以无法 ...

  7. Python开发【第三篇】:Python基本之文件操作

    Python基本之文本操作 一.初识文本的基本操作 在python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open ...

  8. Python开发【笔记】:从海量文件的目录中获取文件名--方法性能对比

    Python获取文件名的方法性能对比 前言:平常在python中从文件夹中获取文件名的简单方法   os.system('ll /data/')   但是当文件夹中含有巨量文件时,这种方式完全是行不通 ...

  9. 智普教育Python培训之Python开发视频教程网络爬虫实战项目

    网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 01.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 02.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Pytho ...

随机推荐

  1. 11张图和源码带你解析Spring Bean的生命周期,建议收藏~!

    在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近把整个流程画成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图 ...

  2. JavaMail 发送邮件出现 Connection reset 问题

    问题描述 使用 java mail 发送邮件的时候,申请的 163 邮箱作为发件箱,然无论如何配置,均出现 Connection reset,无法正常发送邮件. Exception in thread ...

  3. 通俗易懂浅谈理解ES6类this不同指向问题

    1. class Btn{ //定义的一个类 constructor(id){ // constructor是一个构造函数,是一个默认方法,通过 new 命令创建对象实例时,自动调用该方法.一个类必须 ...

  4. 分布式文档存储数据库之MongoDB分片集群

    前文我们聊到了mongodb的副本集以及配置副本集,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13953598.html:今天我们来聊下mongodb的分片 ...

  5. Electron入门指北

    最近几年最火的桌面化技术,无疑是Qt+和Electron. 两者都有跨平台桌面化技术,并不局限于Windows系统.前者因嵌入式而诞生,在演变过程中,逐步完善了生态以及工具链.后者则是依托于Node. ...

  6. IP 层收发报文简要剖析3--ip输入报文分片重组

    在ip_local_deliver中,如果检测到是分片包,则需要将报文进行重组.其所有的分片被重新组合后才能提交到上层协议,每一个被重新组合的数据包文用ipq结构实例来表示 struct ipq { ...

  7. Kafka 消费者及消费者分区策略

    消费方式: consumer 采用 pull(拉)模式从 broker 中读取数据. push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的. 它的目标是尽可能以最 ...

  8. python 之路 面向对象

    ---恢复内容开始--- 一切  万物皆对象. 面向对象其实只是一种编程方式.面向对象式编程可以在很大程度上帮助我们节省时间内存,等问题是我们的代码简单明了. 那么首先定义的格式为class clas ...

  9. 腾讯云容器服务 TKE 推出新一代零损耗容器网络

    随着容器技术的发展成熟,越来越多的组件迁移到容器,在技术迁移过程中,数据库,游戏,AI 这些组件对容器网络性能(时延,吞吐,稳定性)提出了更高的要求.为了得到更优的时延和吞吐表现,各大云厂商都在致力于 ...

  10. Hadoop大数据平台搭建之前期配置(2)

    环境:CentOS 7.4 (1708  DVD) 工具:VMware.MobaXterm 一. 克隆大数据集群 1. 选中已经进行了基本配置的虚拟机,进行克隆. 2. 此处改为"创建完整克 ...