三元运算
三元运算又称三目运算,是对简单的条件语句的简写,如:
简单条件语句:
if 条件成立:
val = 1
else:
val = 2
改成三元运算:
val = 1 if 条件成立 else 2
字符编码
看着别人写的内容挺简单的,但是仔细捋一捋还挺乱,还是硬着头皮把难懂的部分写了写。
参考:https://www.cnblogs.com/happyday56/p/4135845.html
这里面是各种编码方式的详细介绍。
字符在硬盘上的存储
本质上讲,存储形式都是二进制。不过利用不同编码方式映射出来的二进制序列并不相同,所以在读取时,一定要以存放时使用的编码方式来读取,否则就会出现乱码。这就像是用不同语言表达同一个意思,写和读的时候都要用同一种语言。
编码的转换
- unicode是万国码,只要是以unicode形式存储的,所有国家的计算机都能正确显示。
- gbk是我国Windows系统中默认的编码方式。
- Python3上以utf-8编写代码,解释器会把代码字符串转成Unicode后转入内存。
手动编码和解码
Python2不支持自动转换,需要手动转换。
utf-s ——> decode解码 ——> unicode
unicode ——> encode 编码 ——> utf-8
# decode 示例
s="小叮当"
print(s)
s2 = s.decode('utf-8')
print s2
print type(s2)
# encode 示例
s3 = s2.encode('GBK')
print type(s3)
print s3
文件处理
读文件——‘r’或‘rb’
示例1
# 示例1
f = open(file='D:/学习/联系方式.txt',mode='r',coding='utf-8')
data = f.read()
f.close()
# 解释
1.file='D:/学习/联系方式.txt' 表示文件路径
2.mode='r' 表示读写模式为只读
3.coding='utf-8' 表示将硬盘上的0101010按照utf-8的规则断句,然后转换成unicode
4.f.read() 表示读取所有内容,内容是已经转换完毕的字符串
5.f.close() 表示关闭文件
PS:此处的encoding必须和文件在保存时设置的编码保持一致,不然断句会不准确而造成乱码
示例2
f = open(file='D:/学习/联系方式.txt',mode='rb')
data = f.read()
f.close()
# 解释
1.file='D:/学习/联系方式.txt' 表示文件路径
2.mode='rb' 表示读写模式为只读
3.f.read() 表示读取所有内容,内容是已经转换完毕的字符串
4.f.close() 表示关闭文件
示例1和示例2的区别在哪里?
在于示例2打开文件时并未指定encoding,这是为何?是因为直接以rb模式打开了文件,rb是指二进制模式,数据读到内存里直接是bytes格式,如果想看内容还要手动decode,因此在文件打开阶段,不需要指定编码。
如果不知道要处理的文件是什么编码怎么办?
import chardet
f = open('log',mode='rb')
data = f.read()
f.close()
result = chardet.detect(open('log',mode='rb').read())
print(result)
#输出
{'encoding':'GB2312','confidence':0.99,'language':'Chinese'}
chardet是一个非常优秀的编码识别模块。chardet 是python的第三方库,需要下载和安装。
例子:小重山
1.创建一个文本文件,输入文件名为小重山,输入诗词内容
2.用Python语句来读取内容
# 文件名:小重山 文件路径:与代码放在同一文件夹即用相对路径,否则用绝对路径
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
# 代码
f = open('小重山', 'r',encoding='utf8')
data = f.read() # read(5):读取5个字符
print(data)
f.close()
方法
文件不存在会报错
file=open(‘小重山’,‘r’,encoding=‘utf8’) # 把小重山这个文件作为一个对象,‘r’:表示可读,encoding=‘utf8’:编码转换
data=file.read() # 按字符串个数,取字符串内容,默认为所有,可以为数字,表示取多少个字符,加数字没意义
data=file.readline() # 跟随光标按行取内容,每行的末尾都会有一个换行符 \n,也算一个字符,取一行内容
data=file.readlines() # 跟随光标位置开始打印所有行,但是是以列表的形式展现出来,想打印所有,就用 for 循环 data
data=file.readable() # 判断文件是否可读
file.close() # 只要有打开文件的方法存在,就加上文件关闭的方法
file.tell() # 打印当前光标的位置,按utf8来,读一个字母为进1,一个中文进3,GBK,中文进2,按字节移动
file.seek(0) # 重设光标的位置,按字节移动,一个中文3个字节,例如:当断点后,可以记录传输的位置,并从断点的位置开始重传
其他方法:
f.fileno() # 返回一个操作令牌:当一个对象被你使用时,你会获得这个对象的操作令牌,这个操作令牌是唯一的,且为整型
f.isatty() # 判断对象是否为终端,返回:True、false
写文件——‘w’或‘wb’
仍然是对小重山文件进行操作,原来有诗词内容
f = open('小重山', 'w',encoding='utf8')
f.write('hello,world!')
f.close()
# 结果
hello,world!
》原来的内容没有了,以‘w’模式打开时,有该文件就清空文件内容再写入,如果没有这个文件就创建一个文件后再写入
方法
file=open(‘小重山2’,‘w’,encoding=‘utf8’) #当 小重山2 这文件不存在,会自动创建一个,如果里面有内容会清空掉
file.write(‘hello’)
file.write(‘alex’) # 结果是不换行:helloalex,换行要加 \nalex
file.writelines([‘a’,‘b’,‘c’]) # abc
file.flush() # 当写一条数据后,不存入内存缓存,而是立马写进磁盘,确保安全,但是会降低性能,flush 当内存缓存满了也会自动写进磁盘
file.close()
追加——‘a’或‘ab’
f = open('小重山', 'a',encoding='utf8')
f.write('\nhello,world!\n')
f.write('Martin')
f.close()
# 结果
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
hello,world! #追加内容
Martin #追加内容
读写r+
f = open('小重山', 'r+', encoding='utf8')
data = f.read()
print(data)
f.write('\n读写模式!')
f.close()
#结果
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
hello,world!
Martin
读写模式! #先读后写
写读 w+
f = open('小重山', 'w+', encoding='utf8')
data = f.read()
print(data)
f.write('第一季\n')
f.write('第二季\n')
f.write('第三季\n')
f.write('第四季')
print("content", f.read())
f.close()
#结果
content
第一季
第二季
第三季
第四季
content前面空一行,说明之前的内容是空的,w+是先清空或新建,然后再写入、读取
按指定位置读写
这里要用到以下方法:
seek(): 用于移动文件读取指针到指定位置。
tell():返回文件的当前位置,即文件指针当前位置
f = open('小重山', 'r', encoding='utf8')
data = f.read()
print(f.tell())
print(data)
f.seek(8)
print(f.tell())
f.close()
# 结果
12
hello,world!
8
遗留问题
f = open('小重山', 'r+', encoding='utf8')
data = f.read()
print(f.tell())
print(data)
f.seek(6)
f.write("小重山")
print(f.tell())
f.close()
# 文件中出现乱码
hello,小重山��一季
第二季
第三季
第四季
# 之前文件写入方式
f = open('小重山', 'w',encoding='utf8')
f.write('hello,world!')
f.write('\n第一季\n')
f.write('第二季\n')
f.write('第三季\n')
f.write('第四季')
f.close()
# 文件内容
hello,world!
第一季
第二季
第三季
第四季