三元运算
三元运算又称三目运算,是对简单的条件语句的简写
简单条件语句
b = 2
if a > b:
val = a
else:
val = b
改为三元运算
val = a if a > b else val = b
文件
文件操作分为读、写、修改,我们先从读开始学习
读文件
1.mode = 'r'
f = open(file='D:/test.txt',mode='r',encoding='utf-8')
data = f.read()
f.close()
解释:
语句 | 解释 |
---|---|
file='D:/test.txt' | 表示文件路径 |
mode='r' | 表示只读 |
encoding='utf-8' | 表示将硬盘上的 0101010 按照utf-8的规则去“断句”,再将“断句”后的每一段0101010转换成unicode的 01010101,unicode对照表中有01010101和字符的对应关系。 |
读取出来的文件内容是以正常我们能看懂的字符显示的。
encoding指定的字符编码格式必须是 这个文件存储时所使用的编码方式,否则读取出来的文件内容会是乱码
2.mode = 'rb'
f = open(file='D:/test.txt',mode='rb')
解释:
语句 | 解释 |
---|---|
mode='rb' | 表示以二进制模式读 |
读取出来的文件内容是字节类型。即 将二进制数转换成十六进制数,以2个十六进制数为1个组(1个字节)分隔开。这只是为了方便看。
'rb'模式不需要指定encoding。
注意:
文件操作时,以 “r”或“rb” 模式打开,则只能读,无法写入;
硬盘上保存的文件都是某种编码的0101010,打开时需要注意:
rb,直接读取文件保存时原生的0101010,在Python中用字节类型表示
r和encoding,读取硬盘的0101010,并按照encoding指定的编码格式进行断句,再将“断句”后的每一段0101010转换成unicode的 010101010101,在Python中用字符串类型表示
不知道文件编码的情况下
可以用chardet模块里面的detect方法去检测
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'}
循环文件
f = open(file='D:/test.txt',mode='r',encoding='utf-8')
for line in f:
print(line) #这里的line就是文件中每一行的内容
f.close()
写文件
1.mode = 'w'
f = open(file='D:/test.txt',mode='w',encoding='utf-8')
f.write()
f.close()
解释:
语句 | 解释 |
---|---|
mode='w' | 表示只可以写 |
encoding='utf-8' | 将要写入的unicode字符串编码成utf-8格式 |
2.mode = 'wb'
f = open(file='D:/test.txt',mode='w',encoding='utf-8')
解释:
语句 | 解释 |
---|---|
mode='wb' | 表示只以二进制模式写 |
注意:
文件操作时,以 “w”或“wb” 模式打开,则只能写,并且在打开的同时会先将内容清空。写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:
wb,写入时需要直接传入以某种编码的0100101,即:字节类型
w 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 >010101010
读写模式
1.读写模式mode = 'r+'
f = open("test.txt",'r+',encoding="gbk")
data = f.read() #可以读内容
print(data)
f.write("\nblack girl=") #可以写
f.close()
写的内容追加到了文件的最后
2.写读模式mode = 'w+'
f = open("test.txt",'w+',encoding="gbk")
data = f.read()
print(data)
f.write("\nnewline 1哈哈")
f.write("\nnewline 2哈哈")
f.write("\nnewline 3哈哈")
f.write("\nnewline 4哈哈")
print("content",f.read())
f.close()
输出:
#注意这是个空行, 是上面print(data)的结果,代表 根本 没读到内容
content #从这开始,读到的是刚写入的内容
newline 1哈哈
newline 2哈哈
newline 3哈哈
newline 4哈哈
w+模式会先把文件清空,因此第一行读到的是空行。
清空完文件再写入,所以读的内容都只是新写入的内容。
追加
f = open('D:/test.txt','a',encoding='gbk')
f.write('\ntest')
f.close()
运行结果:
...
...
...
test #这行是添加的
注意:
文件操作时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容
写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:
ab,写入时需要直接传入以某种编码的0100101,即:字节类型
a 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010
修改文件
1.占硬盘方式的文件修改代码示例
1.逐行读出旧文件内容
2.修改文件内容写入新文件
3.新文件覆盖旧文件
import os
f_name = "modifile.txt"
f_new_name = "{}.new".format(f_name)
old_str = "乔亦菲"
new_str = "[乔亦菲 Yifei Qiao]"
f = open(f_name,'r',encoding="utf-8")
f_new = open(f_new_name,'w',encoding="utf-8")
for line in f:
if old_str in line:
new_line = line.replace(old_str,new_str)
else:
new_line = line
f_new.write(new_line)
f.close()
f_new.close()
os.rename(f_new_name,f_name) #把新文件名字改成原文件的名字,就把之前的覆盖掉了
#windows使用os.replace
os.replace(f_new_name,f_name)
2.占内存方式修改代码示例
1.读出文件内容
2.修改文件内容
3.将内容写回文件中
f_name = "modifile.txt"
f = open(f,'r+')
data = f.read()
old_str = "wen"
new_str = "ye"
data = data.replaces(old_str,new_str)
f.seek(0) #将指针调回文件开始时
f.write(data)
f.close()
文件方法
方法 | 说明 |
---|---|
file.read([size]) | 从文件读取指定的字节数,默认或复数读取所有 |
file.readline() | 只读一行,遇到\r 或 \n为止 |
file.readlines() | 用于读取所有行并返回列表直到结束符EOF。该列表可以由 Python 的 for ... in ... 结构进行处理。如果碰到结束符 EOF 则返回空字符串 |
file.write(str) | 将str写入文件当中 |
file.writeline(seq) | 将序列写入文件中 |
file.close() | 关闭文件 |
file.flush() | 把文件从内存buffer里强制写入到硬盘 |
file.readable() | 判断文件是否可读 |
file.writable() | 判断文件是否可写 |
file.seekable() | 判断文件是否可以进行seek操作 |
file.seek() | 把操作文件的光标移到指定位置 *注意seek的长度是按字节算的,而字符编码存每个字符所占的字节长度不一样。 |
file.tell() | 返回当前文件操作光标位置 *以字节为单位 |
file.truncate([size]) | 按指定长度截断文件 *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。 |