一、文件操作

文件操作分为三个步骤:文件打开、操作文件、关闭文件,但是,我们可以用with来管理文件操作,这样就不需要手动来关闭文件。

实现原理:

import contextlib
@contextlib.contextmanager
def show():
print('123')
yield
print('456') with show():
print('777')
print('888')
print('999')

操作步骤

#windows下默认为gbk,要指定编码为'utf-8'
#'r'为只读,'test.txt'为文件路径
f=open('test.txt','r',encoding='utf-8') #utf-8编码方式打开文件
data=f.read()               #操作文件
f.close()                 #关闭文件
print(data) # 用with语句打开,不需要手动关闭
with open('test.txt','r',encoding='utf-8') as f:
print(f.read())

示例 

# r,只读模式【默认,不存在则报错】
# w,只写模式【不可读:不存在则创建;存在则清空内容】
# x,只写模式【不可读:不存在则创建,存在则报错】
# a,追加模式【不可读;不存在则创建;存在则只追加内容】
# "+"表示可以同时读写某个文件,比如r+、w+、x+、a+
# "b"表示以字节的方式操作,rb或r+b,wb或w+b,xb或x+b,ab或a+b,
# 以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,这些都需要程序员来做转换。
# f.tell() 读取指针的位置
# f.seek() 设置指针的位置 # r只读(不存在则报错)
with open('test.txt', 'r', encoding='utf-8') as f:
print(f.read()) # test.txt,不存在,报错 # w只写(不可读,不存在创建,存在则清空)
with open('test.txt', 'w') as f:
f.write('123') # 创建test.txt 写入新内容123 # x只写(不可读,不存在创建,存在报错)
with open('test.txt', 'x') as f:
f.write('666') # 这里存在,报错 # a追加模式(不可读,不存在创建,存在往末尾追加)
with open('test.txt', 'a') as f:
f.write('111') # 往test.txt里面追加111 # 以字节方式打开,将test.txt里面的文件内容清空,往里面写入'大家好',需要将内容转换成bytes类型
with open('test.txt', 'wb') as f:
str_data = '大家好'
byte_data = str_data.encode('utf-8')
f.write(byte_data) # 以rb读
with open('test.txt', 'rb') as f:
data = f.read()
print(data) # b'\xe5\xa4\xa7\xe5\xae\xb6\xe5\xa5\xbd'
print(type(data)) # 打印出读取的类型<class 'bytes'>
str_data = data.decode('utf-8')
print(str_data) # 大家好 # r+形式 写的时候在末尾追加,指针移到到最后
with open('test.txt','r+',encoding='utf-8') as f:
print(f.tell()) # 打印下 文件开始时候指针指向哪里 这里指向 0
print(f.read()) # 读出文件内容'大家好'
print(f.tell()) # 文件指针指到 9,一个汉子三个字符串,指针是以字符为单位
f.write('我在学习') # 写入内容'我在学习',需要特别注意此时文件指针在末尾
print(f.read()) # 指针到末尾去了,所以读取的内容为空
print(f.tell()) # 指针指到15
f.seek(0) # 将指针内容指到 0 位置
print(f.read()) # 因为文件指针指到开头去了,所以可以读到内容 大家好我在学习 # w+形式 存在的话先清空 一写的时候指针到最后
with open('test.txt', 'w+') as f:
f.write('python') # test.txt存在,所以将内面的内容清空,然后再写入 'python'
print(f.tell()) # 此时指针指向6
print(f.read()) # 读不到内容,因为指针指向末尾了
f.seek(0) # 移动指针到开头
print(f.read()) # 读到内容 # a+打开的时候指针已经移到最后,写的时候不管怎样都往文件末尾追加
with open('test.txt', 'a+') as f:
print(f.tell())
f.write(' is best')
print(f.read()) # 读不到内容,因为指针指向末尾了
f.seek(0) # 移动指针到开头
print(f.read()) # 读到内容 # x+文件存在的话则报错
with open('test.txt', 'x+') as f: # FileExistsError: [Errno 17] File exists: 'test.txt'
print(f.tell())
f.write(' hello')
print(f.read())
f.seek(0)
print(f.read())  

同时操作多个文件

# 拷贝A文件到B文件中
with open('A.txt','r',encoding='utf-8') as fr,open('B.txt','w',encoding='utf-8') as fw:
for line in fr: # 一行行的读
fw.write(line) # 一行行的写

二、字符编码

在python中,编码是一个比较折腾的难点,特别是python2。

首先,了解下这几种编码:

  ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号,显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode

  Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,注:此处说的的是最少2个字节,可能更多

  UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

在python3中,字符串编码是unicode,默认文件编码是utf-8(存在硬盘上的文件),所以可以省略文件头编码声明:#-*- coding:utf-8 -*-

读取到内存会被python解释器自动转换成unicode

而且,所有的unicode字符编码后都会变成bytes类型

但是如果是其他文件编码,如gbk,则需要声明文件编码:#-*- coding:gbk -*-,但是以gbk读取到内存中后,依然会转为unicode

总之,以什么编码方式存在硬盘上(代码字符串文件头定义的编码,比如:# -*- coding:utf8 -*-),就用什么编码方式从硬盘上读,不管什么编码方式,python3都会将字符串在内存中转为unicode

py3自动把文件编码转为unicode必定是调用了什么方法,这个方法就是,decode(解码) 和encode(编码)

UTF-8 --> decode 解码 --> Unicode

Unicode --> encode 编码 --> GBK / UTF-8

#-*- coding:utf-8 -*-
import sys
print(sys.getdefaultencoding()) # utf-8
s = '你好'
print(s) # 你好
print(type(s)) # <class 'str'>
print(s.encode()) # b'\xe4\xbd\xa0\xe5\xa5\xbd'
s_to_gbk = s.encode('gbk') # 编码成gbk
print(s_to_gbk) # b'\xc4\xe3\xba\xc3'
print(s_to_gbk.decode('gbk').encode('utf-8')) # gbk转成utf-8,和上面s.encode()一样,b'\xe4\xbd\xa0\xe5\xa5\xbd'

三、练习题(参考答案已放在Q群文件中)

1.实现简单的shell sed替换功能

2.注册

  注册信息存放在文件中

3.模拟登陆

  连续登陆失败三次,就锁定用户

Python【第三篇】文件操作、字符编码的更多相关文章

  1. python基础之 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  2. python第三天基础之字符编码

    一 了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的, ...

  3. Python(三)——文件操作

    在我们用语言的过程中,比如要往文件内进行读写,那么势必要进行文件操作,那么咋操作呢?用眼睛直接看么?今天就定个小目标,把文件读写那些事扯一扯 文件操作 把大象放进冰箱分几步? 第一步:打开冰箱 第二步 ...

  4. 2 python第三章文件操作

    1.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成立 els ...

  5. Python 第三天 文件操作(2)

    文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  fi ...

  6. python入门三:文件操作

    一.文件操作 1.文件对象:和c一样,要想对一个文件进行操作,需要获取该文件的对象 f = open("xxx") # 打开文件并获取文件对象 f.xxx # 对文件进行某些操作 ...

  7. python学习笔记(2)--列表、元组、字符串、字典、集合、文件、字符编码

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表和元组的操作 列表是我们以后最长用的数据类型之一,通过列表可以最方便的对数据实现最方便的存储.修改等操作 定 ...

  8. Day2 - Python基础2 列表、字符串、字典、集合、文件、字符编码

    本节内容 列表.元组操作 数字操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 ...

  9. Python入门篇-文件操作

    Python入门篇-文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.文件IO常用操作 open:打开 read:读取 write:写入 close:关闭 readlin ...

  10. python基础篇(文件操作)

    Python基础篇(文件操作) 一.初始文件操作 使用python来读写文件是非常简单的操作. 我们使用open()函数来打开一个文件, 获取到文件句柄. 然后通过文件句柄就可以进行各种各样的操作了. ...

随机推荐

  1. (详细)华为荣耀V10 BKL-AL00的USB调试模式在哪里打开的步骤

    每当我们使用pc连接安卓手机的时候,如果手机没有开启Usb开发者调试模式,pc则无法成功检测到我们的手机,有时我们使用的一些功能比较强的的app比如以前我们使用的一个app引号精灵,老版本就需要开启U ...

  2. (简单)华为荣耀4A SCL-TL00的usb调试模式在哪里打开的方法

    就在我们使用PC通过数据线连接上安卓手机的时候,如果手机没有开启Usb调试模式,PC则没办法成功检测到我们的手机,有时候,我们使用的一些功能强大的App好比之前我们使用的一个App引号精灵,老版本就需 ...

  3. Python使用Plotly绘图工具,绘制散点图、线形图

    今天在研究Plotly绘制散点图的方法 使用Python3.6 + Plotly Plotly版本2.0.0 在开始之前先说说,还需要安装库Numpy,安装方法在我的另一篇博客中有写到:https:/ ...

  4. nginx配置proxy_pass URL末尾加与不加/(斜线)的区别

    nginx在配置proxy_pass的时候 URL结尾加斜线(/)与不加的区别和注意事项 假设访问路径的 /pss/bill.html 加/斜线的情况 location /pss/ { proxy_p ...

  5. 使用mybatis操作AS400数据库

    先简单说一下怎么使用[jt400.jar]连接AS400上的DB2数据库. ※ jt400.jar资源,如果有安装AS400客户端的话,参考IBM官网 ※ http://www-01.ibm.com/ ...

  6. 英语口语练习系列-C16-钱

    词汇学习 beer [bɪə(r)] n. 啤酒 a glass of beer 一杯啤酒 five glasses of beer 五杯啤酒 beers (种类) Shall we have a b ...

  7. 事务的ACID属性,图解并发事务带来问题以及事务的隔离级别

    事务的概述 事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组 ...

  8. Jetson TX2(3)opencv3 打开usb摄像头

    ubuntu2604 opencv3.4.0 https://blog.csdn.net/ultimate1212/article/details/80936175?utm_source=blogxg ...

  9. matlab读取csv文件数据并绘图

    circle.m(画二维圆的函数) %该函数是画二维圆圈,输入圆心坐标和半径%rectangle()函数参数‘linewidth’修饰曲线的宽度%'edgecolor','r',edgecolor表示 ...

  10. AI MobileNet

    MobileNet,是针对移动和嵌入式设备的一类高效模型,基于流线型(streamlined)架构,使用深度可分离卷积(depthwise separable convolution)来构建轻量级深度 ...