PythonDay16

每日一记

流:I/O
一,编码
编码
明文------>暗文
<------
解码
ASCII码(0-127)
ANSI码(拉丁文)
GB2312(7000多个简体汉字) 前八位和后八位都大于127时才表示汉字
GBK(包含GB2312 且增加了20000多个汉字) 前八位大于127表示汉字
UNICODE
UTF-8(推荐)
py2中的string编码 (str,unicode(u)) str+unicode(可以) str---->unicode (str类型自动转换为unicode类型)
py3中的string编码 (str,bytes(b)) str+bytes(不可以)

#py3的编码
import json
s="张三"
print(type(s)) #<class 'str'>
print(json.dumps(s)) # "\u5f20\u4e09"
b=s.encode('utf8')
print(type(b)) # <class 'bytes'>
print(b) # b'\xe5\xbc\xa0\xe4\xb8\x89'
u=b.decode('utf8')
print(type(u)) #<class 'str'>
print(u) #张三
print(json.dumps(u)) #"\u5f20\u4e09"

py3的编码哲学:
Python 3 最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分,不再会对 bytes 字节串进行自动解码。文本总是 Unicode,由 str 类型表示,二进制数据则由 bytes 类型表示。Python 3 不会以任意隐式的方式混用 str 和 bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也
无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。

#查看编码方式
import sys
print(sys.getdefaultencoding())

a = open("h.txt")
print(a.read())

当执行 open 函数时,调用的是操作系统打开文件,操作系统用默认的 gbk 编码去解码 utf8 的文件,自然乱码。
解决办法:

f=open('hello',encoding='utf8')
print(f.read())

如果你的文件保存的是 gbk 编码,在 win 下就不用指定 encoding 了。
另外,如果你的 win 上不需要指定给操作系统 encoding=‘utf8’,那就是你安装时就是默认的 utf8 编码
或者已经通过命令修改成了 utf8 编码。
注意:open 这个函数在 py2 里和 py3 中是不同的,py3 中有了一个 encoding=None 参数
二,I/O
I-input 输入 读取数据
O-output 输出 写入数据

open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)
r ---- 只读 str 文件的指针将会放在文件的开头。这是默认模式。
rb ---- 二进制格式只读 bytes 文件的指针将会放在文件的开头。这是默认模式。
r+ ---- 用于读写 指针在开头
rb+ ---- 二进制读写 指针在开头
w ---- 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb ---- 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+ ---- 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+ ---- 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a ---- 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab ---- 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ ---- 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ ---- 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

有一个a.txt文件
hello
this is a fine day
that'is beautiful

#读文件
data = open("a.txt",mode="r",encoding="utf8")
f = data.read()
print(f)
#写文件  (使用 w 时事实上是创建了一个新文件,如果源文件存在,会覆盖)
data = open("a.txt",mode="w",encoding="utf8")
data.write("I'm happy")
#追加文件  (使用a时,是在末尾追加)
data = open("a.txt",mode="a",encoding="utf8")
data.write("I'm happy")
#追加时想要换行前面加上\n
data = open("a.txt",mode="a",encoding="utf8")
data.write("\nI'm happy")
#以行读取文件
data = open("a.txt",mode="r",encoding="utf8")
print(data.readline())
for i in range(2):
    print(data.readline())

使用 readline()读取的是文件的单行,readlines()会读取文件全部行,每行作为一个元素
形成一个列表。readlines()因为会一下子把文件全部读取到内存,所以只适合读小文件。

#下面是读取文件,但不读取第3行
data = open("a.txt",mode="r",encoding="utf8")
for index,line in enumerate(data.readlines()): #使用遍历读取文件
    if index == 2:
        print('------------------分割线-------------------')
        continue
    print(line.strip())

#处理大文件的方法:这行代码的效果和上面的一样,只是使用了迭代器,使得内存可以只保留一行
data = open("a.txt",mode="r",encoding="utf8")
count = 0
for line in data: #一行行读取文件,内存中只保留一行。
 if count == 2:
    print('------------我是分割线---------------')
    count += 1
    continue
 else:
    print(line.strip())
    count += 1
    
#打印进度条的小方法:
import sys,time
for i in range(100):
	sys.stdout.write("#") #sys.stdout 方法在同一行打印
	sys.stdout.flush() #每打印一个#符号写入一次
	time.sleep(0.5)
#替换
data = open('a.txt','r',encoding='utf-8')
new_data = open('a.bak','w',encoding='utf-8')
for line in data:
    if 'hello' in line:
        line = line.replace('hello','nihao')
    new_data.write(line)
data.close()
new_data.close()

猜你喜欢

转载自blog.csdn.net/weixin_43895297/article/details/87867232