Python全栈开发实战学习3

三元运算

三元运算又称三目运算,是对简单的条件语句的简写,如:
简单条件语句:

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!
第一季
第二季
第三季
第四季
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值