Python菜鸟起飞day3--编码和文件操作

目录

一、编码历程
二、文件操作
#1.绝对路径和相对路径
#2. 建立文件对象(打开文件、句柄)
#3. 常用函数(python3)
#4. 实例
###4.1 模仿linux下命令行的进度条(flush()函数)
###4.2 使用print()函数写入文件
###4.3 在一个文本文件的第三行追加一个字符串
#5. with关键字

一、编码历程

二进制
过渡到–>ASCII码:智能存英文和拉丁字符。一个字符占一个字节,8位
在中国的发展
---------->gb2312:1980年,只能存6700多个中文
-------------->gbk1.0存2万多字符,1995
----------------->gb18030:2000,27000中文
在国际上的发展:万国码
----->unicode:utf-32,一个字符占4个字节
----->unicode:utf-16,一个字符占两个字节或者两个以上,
----->unicode:utf-8,英文用ASCII码存,一个中文占3个字节,

在python2中
默认编码:ASCII码
在python3中
默认编码:unicode

二、文件操作

1. 绝对路径和相对路径

2. 建立文件对象(打开文件、句柄)

	使用open()函数打开文件。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
	file: 必需,文件路径(相对或者绝对路径)。
	mode: 可选,文件打开模式
    buffering: 设置缓冲
    encoding: 一般使用utf8
    errors: 报错级别
    newline: 区分换行符
    closefd: 传入的file参数类型
    opener:
模式描述
t文本模式(默认
x写模式,新建一个文件,如果该文件已存在,则会报错
b二进制模式
+打开一个文件进行更新
r以制度方式打开文件。文件的指针将会放在文件开头,这是默认模式
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头,这是默认模式。一般用于读取二进制文件,如图片。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
w用只读模式打开文件。如果该文件已存在则会覆盖原有内容。如果文件不存在,则创建文件
wb以二进制格式打开一个文件只写入。如果文件已存在则会覆盖原有内容。如果文件不存在,则创建文件
wb+以二进制格式打开一个文件用于读写。如果文件已存在则会覆盖原有内容。如果文件不存在,则创建文件
a打开一个文件进行追加,文件不存在则会创建新文件写入。
ab以二进制格式打开一个文件进行追加。文件不存在则会创建新文件进行写入。
a+打开一个文件进行追加模式的读写。文件不存在则会创建新文件进行读写。
ab+以二进制格式打开一个文件用于追加。文件不存在则会创建新文件进行读写。

3.常用函数(python3)

函数名功能
read([size])从文件读取指定的字节数,如果未给定或为负则读取所有。
readline([size])读取整行,包括 “\n” 字符。
readlines([sizeint])读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
write(str)将字符串写入文件,返回的是写入的字符长度。
writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
tell()返回文件当前位置。一个汉字占3个位置(utf-8)
truncate([size])从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
seek(offset[, whence])移动文件读取指针到指定位置(见附加)
flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
close()关闭文件。关闭后文件不能再进行读写操作。该函数会进行flush()操作

附加:


fileObject.seek(offset[, whence])
参数:
offset – 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。

whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;
0 代表从文件开头开始算起,
1 代表从当前位置开始算起,
2 代表从文件末尾算起。
返回值:
如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。


4.实例

4.1 模仿linux下命令行的进度条(flush()函数)

import sys,time
for i in range(30):
    sys.stdout.write('*')
    sys.stdout.flush()
    time.sleep(0.2)
'''
输出结果:
每隔0.2秒在屏幕上打印一个*,一共打印30个,最终在屏幕上显示30个*
'''

4.2 使用print()函数写入文件

f = open('小重山.txt', 'w',encoding='utf-8')
for i in range(30):
    print('zzh',file=f,flush=True)
f.close()

4.3 在一个文本文件的第三行追加一个字符串

f = open('小重山.txt', 'r+',encoding='utf-8')
number = 0
while True:
    line = f.readline()
    print(f.tell())
    number+=1
    if number == 2:#此时读取到第二行,则指针移动到了第二行尾部,故接下来的操作是对第三行进行的
        index = f.tell()#记录此时的指针位置
        line = f.readline()#读取第三行内容
        lines = f.read()#读取第三行以后的内容
        line = ''.join([line.strip(),'走四方\n'])#在第三行追加内容
        line = ''.join([line,lines])#将处理后的第三行内容与原来的第三行以后的内容链接
        f.seek(index)#将指针移动到第二行尾部
        f.write(line)#写入处理后的内容
        f.flush()#刷新缓冲区
        break 
f.close()

注1:在实现这个功能的时候犯了一次傻,,在定位到第三行之后,当时尝试直接只修改第三行,处理之后写入到文件,第四行的内容也改变了。应该是因为文件内容在磁盘上存储在一段连续的区域中,所以只对第三行进行修改而不去读取其他的内容是行不通的。
注2:该功能的实现可以新建一个新文件,结合注3将内容进行处理再写入到新文件。
注3:在读取大文件的时候,为避免造成不必要的内存占用,在读取文件的时候应该采取这样的方式。for循环中会建立迭代器

f = open('小重山.txt', 'w',encoding='utf-8')
for i in range(30):#内部建立迭代器,每次只读取一行到内存中
    print('zzh',file=f,flush=True)
f.close()

5. with关键字

with是python2.5以后有的,它实质是一个控制流语句,with可以用来简化try…finally语句,它的主要用法是实现一个类_enter_()和_exit_()方法。
详情参见:https://www.jb51.net/article/92387.htm

以下内容摘自:https://blog.youkuaiyun.com/lu13093323120/article/details/82195060

对于系统资源如文件、数据库连接、socket 而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(断开)该资源。

如何正确的关闭一个文件呢?

a. 普通版

f = open("1.txt", "w")
f.write("0000")
f.close()

b. 进阶版

 f = open("1.txt", "w")
    try:
        f.write("111111")
    except Exception:
        print("ERROR")
    finally:
        f.close()

c. 高级版

 with open("1.txt", "w") as f:
        f.write("2222")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值