一:字符编码
字符编码是一套把人类使用的字符一一对应一个用二进制表示的数字的标准(人类的语言依靠这套标准就可以翻译成计算机能读懂的语言了)
1,字符编码发展阶段
ASCII码:美国人创造,最早只有127个字符被编码到计算机里(大小写英文,数字与一些符号),使用一个字节(byte) 表示英文字符
各国自己的一套编码标准:我们中国制定了gb2312(gbk);日本人制定了shift_JIS;这类标准大都只包含自己本国的语言,一些英文字符与符号,并没有其他国家语言字符的编码,所以当用这类编码标准去编码其他国家的语言,就会发生乱码的结果(因为这套标准里根本就不存在其他国家语言字符的一一对应关系)
unicode标准:这个标准就是为了解决各个标准不兼容导致乱码而产生的,它把所有的语言都统一到一套标准里面,这样就不会再有乱码的问题了。unicode一般使用2个字节表示一个字符;当一个文本基本上全是英文的话,用unicode编码比用ASCII编码多一倍的存储空间,在存储和传输上就十分不划算,所有在unicode标准基础上又诞生了UTF-8标准
UTF-8标准:Unicode Transformation format, UTF-8编码把一个unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字符被编码成1个字节,汉子通常是3个字节
2,计算机系统里字符编码工作方式
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
如何保证不会乱码呢?字符按照哪种字符编码 编码的,就要按照哪种字符编码解码
二:文件处理
注意:一定要注意文件内光标的移动,一定要注意文件内光标的移动,一定要注意文件内光标的移动!
# r 模式是只读模式 等同于rt 模式 # t 模式表示以文本(字符串)的方式操作文件
#当文件不存在时会报错
#方式一:
f = open('aaaa',encoding='utf-8') #默认模式是r模式
print(f.read()) #从头开始读,全部读完,光标定位到该文件最后
f.close() #把系统中运行的文件关掉,以腾出内存空间
#方式二:推荐
with open('aaaa',encoding='utf-8') as f: #采用这种方式可以不用去关心该不该关掉系统中还在运行的该文件
print(f.readable()) #判断文件是否可读
print(f.readline()) #一行一行读文件内的内容,一次只读一行,光标定位在下一行开头
print(f.readlines()) #一行一行读文件,并把文件的每行内容保存为一个字符串,加入一个列表中
# w 模式是只写模式 等同于wt模式
# w 模式下,打开一个文件,该文件存在时会清空它的内容;该文件不存在时,会自动以该文件名和格式创建一个空文件
with open('a.txt',mode='w',encoding='utf-8') as f:
print(f.write('jsdfkjsjk\n'))
print(f.writelines(['aa','bb'])) #把列表中的项依次写入文件中,要实现换行的功能使用\n ;与readlines()方法执行相反的操作
# a 模式是追加写入模式,不可读, 每次在文件的最后追加写入内容;适用于写日志类型文件
#当要打开的文件不存在时,会以该文件名和格式创建一个空文件
with open('a3.txt',mode='a',encoding='utf-8') as f: #光标每次定位在文件的末尾
print(f.write('rock')) #write()的参数只能是字符串,不能是列表
print(f.writelines(['bbbbb\n','cccc\n'])) #writelines()方法的参数可以是列表,也可以是字符串
#用 a 模式写入信息的文件,可以再用 r 模式去查看文件的内容
with open('a3.txt',mode='r',encoding='utf-8') as g:
print(g.read())
#b 模式,字节模式,即以字节的方式操作文件(主要针对非文本文件,当然也可用于操作文本文件)
with open('1.jpg',mode='rb') as f: #不需要encoding参数;只读模式,r 模式的规则仍然适用;rb都不能省略
data = f.readline()
print(type(data)) #<class 'bytes'>
print(data)
with open('1.jpg','wb') as f : #只写模式,w 模式的规则仍然适用
f.write() #传入一个字节参数
# r+ 模式(r+t的省略写法),可写可读模式 #w+ a+ 都是可读可写模式;但r,w,a,它们各自的特征仍然适用
with open('a3.txt',mode='r+',encoding='utf-8') as f:
print(f.readable())
print(f.writable())
文件的修改:
#方式一:
#将存放在硬盘上的该文件的内容全部读入内存中,在内存中进行修改,修改后再次存入该文件(以覆盖文件原内容的方式)
with open('a3.txt',encoding='utf-8') as f: #先用只读模式,一次全部读完,然后进行修改
data = f.read()
data = data.replace('ruck','rock')
with open('a3.txt','w',encoding='utf-8') as f: #再用只写模式,先清空文件的原内容,然后把修改后的写入该文件
f.write(data)
#方式二:
#将文件的内容一行一行(采用循环的方式)读入内存,修改后存入一个新文件,全部修改完后删去源文件,用新文件代替它
import os
with open('a3.txt',encoding='utf-8') as src_f,\
open('a3_swap.txt','w',encoding='utf-8') as new_f :
for line in src_f:
if 'ruck' in line:
line = line.replace('ruck','rock')
new_f.write(line)
os.remove('a3.txt') #删除源文件
os.rename('a3_swap.txt','a3.txt') #将新文件用源文件的文件名重新命名
文件的复制
import sys
alist = sys.argv #把命令行中python解释器后面的用空格分隔的参数全都存到这个列表里面去
src_path = alist[1] #E:\pythonhomework\3-19.txt
new_path = alist[2] #F:\python\3-19.txt
with open(r'%s' %src_path,'rb') as read_f,\ #r代表raw 原生的意思,即后面字符串中的字符都不具有特殊意义,\不再具有转义的作用
open(r'%s' %new_path,'wb') as write_f:
# data = read_f.read()
# write_f.write(data)
for line in read_f: #推荐使用for循环来一行一行复制文件内容
write_f.write(line)
#命令行格式 python3 py文件绝对路径 源文件绝对路径 复制文件绝对路径