三元运算又称三目运算,是对简单的条件语句的简写,如:
简单条件语句:
if 条件成立:val = 1
else:val = 2
改成三元运算:
val = 1 if 条件成立 else 2
看着别人写的内容挺简单的,但是仔细捋一捋还挺乱,还是硬着头皮把难懂的部分写了写。
这里面是各种编码方式的详细介绍。
本质上讲,存储形式都是二进制。不过利用不同编码方式映射出来的二进制序列并不相同,所以在读取时,一定要以存放时使用的编码方式来读取,否则就会出现乱码。这就像是用不同语言表达同一个意思,写和读的时候都要用同一种语言。
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
示例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
ad() 表示读取所有内容,内容是已经转换完毕的字符串
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' 表示读写模式为只读
ad() 表示读取所有内容,内容是已经转换完毕的字符串
4.f.close() 表示关闭文件
示例1和示例2的区别在哪里?
在于示例2打开文件时并未指定encoding,这是为何?是因为直接以rb模式打开了文件,rb是指二进制模式,数据读到内存里直接是bytes格式,如果想看内容还要手动decode,因此在文件打开阶段,不需要指定编码。
如果不知道要处理的文件是什么编码怎么办?
import chardetf = 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’:编码转换
dataad() # 按字符串个数,取字符串内容,默认为所有,可以为数字,表示取多少个字符,加数字没意义
dataadline() # 跟随光标按行取内容,每行的末尾都会有一个换行符 n,也算一个字符,取一行内容
dataadlines() # 跟随光标位置开始打印所有行,但是是以列表的形式展现出来,想打印所有,就用 for 循环 data
dataadable() # 判断文件是否可读
file.close() # 只要有打开文件的方法存在,就加上文件关闭的方法
ll() # 打印当前光标的位置,按utf8来,读一个字母为进1,一个中文进3,GBK,中文进2,按字节移动
file.seek(0) # 重设光标的位置,按字节移动,一个中文3个字节,例如:当断点后,可以记录传输的位置,并从断点的位置开始重传
其他方法:
f.fileno() # 返回一个操作令牌:当一个对象被你使用时,你会获得这个对象的操作令牌,这个操作令牌是唯一的,且为整型
f.isatty() # 判断对象是否为终端,返回:True、false
仍然是对小重山文件进行操作,原来有诗词内容
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()
f = open('小重山', 'a',encoding='utf8')
f.write('nhello,world!n')
f.write('Martin')
f.close()
# 结果
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
hello,world! #追加内容
Martin #追加内容
f = open('小重山', 'r+', encoding='utf8')
data = f.read()
print(data)f.write('n读写模式!')
f.close()
#结果
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
hello,world!
Martin
读写模式! #先读后写
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()
ll())
print(data)
f.seek(8)
ll())
f.close()# 结果
12
hello,world!
8
f = open('小重山', 'r+', encoding='utf8')
data = f.read()
ll())
print(data)
f.seek(6)
f.write("小重山")
ll())
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!
第一季
第二季
第三季
第四季
本文发布于:2024-02-03 23:18:32,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170697358451510.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |