python全栈开发学习模块二(笔记1)

三元运算

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

简单条件语句

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方法去检测

扫描二维码关注公众号,回复: 1907527 查看本文章
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]) 按指定长度截断文件 *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。

猜你喜欢

转载自www.cnblogs.com/kinman/p/9272121.html