f = open('info.txt',mode = 'r',encoding='utf-8') data = f.read()
1.4.2read()读指定的内容
在文件上传的时候大多也会使用这种方式,一点字节一点字节的发送。
1 2
f = open('info.txt',mode = 'r',encoding='utf-8') data = f.read(2)#读取2个字符
1 2 3 4 5 6 7 8
f = open('info.txt',mode = 'r',encoding='utf-8') a = f.read(1)#读取第1个字符 b = f.read(1) c = f.read(1) d = f.read(1) e = f.read(1) print(a,b,c,d,e) #一个一个字符的读取,由于光标在每一次读取后都会往后推进一个,所以每一次读取的内容是不一样的。
1.4.3readline()读一行
1 2 3
f = open('info.txt',mode = 'r',encoding='utf-8') data = f.readline(2)#读取第二行的内容 #一般用于处理庞大的文件,如果直接用read会导致内存崩溃,but readline每次只读取一行内容,极大的减少了内存的负担。
1.4.4readlines()读取所有行,返回一个列表,其中每一个元素是每一行的内容。
1.4.5for循环
1 2 3 4 5 6 7 8 9 10
f = open('info.txt',mode = 'r',encoding='utf-8') for line in f: print(line.strip())#删除每一行的换行符,因为每一次循环print的时候也会有一个换行符。 #输出 ''' 小丑 动感 joker 你好 '''
1.4.6write,写
1 2 3
f = open('info.txt',mode = 'a',encoding='utf-8') f.write("dhk") f.close
1.4.7flush,刷到硬盘
1 2 3 4 5 6
f = open('info.txt',mode = 'a',encoding='utf-8') whileTrue: f.write("dhk") #不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。 f.flush()#直接刷到硬盘 f.close
1.4.8移动光标位置(字节)
1 2 3
f = open('info.txt',mode (= 'r+',encoding='utf-8') f.seek(1) #将光标移动到指定位置。
注意:在a模式下,write只会写到文件的最后,不会写到指定的光标位置。
1.4.9获取光标位置
1 2 3
f = open('info.txt',mode (= 'r+',encoding='utf-8') p1 = f.tell() print(p1)
1.5上下文管理
之前对文件进行操作的时候,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。
以后再进行文件操作时,推荐大家使用with上下文管理,他可以实现自动关闭文件。
1 2 3 4
withopen('info.txt',mode (= 'r+',encoding='utf-8') as f data = f.read() print(data) #在缩进结束的时候,他就会自动的帮你关闭文件。
在python2.7后,with又支持同时对多个文件的上下文进行管理,即:
1 2
withopen('info.txt',mode (= 'r+',encoding='utf-8') as f,open('info2.txt',mode (= 'r+',encoding='utf-8') as f2 pass
import requests headers = { "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36", }#指定文件头 url ="https://video.pearvideo.com/mp4/adshort/20200709/cont-1684816-15252785_adpkg-ad_hd.mp4" response = requests.get(url,headers=headers,stream=True) #介绍一下这个stream模块 #当stream=True时,如果是下载大的文件时,用True,可以先对请求的类型进行判断,如果是大文件,可以中止请求,而不用浪费大流量开销。如果不加stream=True,那么硬盘很可能就不停被写入,文件会变得无比巨大,最后磁盘空间不够死机。 #当stream=False时,如果是请求的大文件,其会进入内存并进行下载,消费大量的内存和流量。 print(response.status_code) print(response.headers['content-length']) content_size = int(response.headers['content-length']) # print(response.text) # print(response.content) n = 1 withopen("v.mp4","wb") as f: for i in response.iter_content(chunk_size=1024):#这个进度条我是偷别人的嘿嘿。 rate=n*1024/content_size print("下载进度:{0:%}".format(rate)) f.write(i) n+=1 print("下载完成")
第二个扩展,将一个文件中的其中一个字符修改成另外一个字符
小文件:文件读到内存,再通过replace
大小文件都可以使用:同时打开两个文件,读+写
这里演示一下第二种思路。
1 2 3 4 5 6 7
withopen('info.txt',mode='r') as c1 , open('new.txt',mode='a') as c2: for line in c1: new_line = line.replace('joker','dhk') c2.write(f'{new_line}') #重命名文件之后就可以覆盖掉原文件 #imort shutil #shutil.move('new.txt','info.txt')
import xml.etree.ElementTree as ET tree = ET.ElementTree(file="country.xml") # <xml.etree.ElementTree.ElementTree object at 0x03031390> root = tree.getroot() # <Element 'data' at 0x030EA600>
# 遍历xml文档的第二层 for child in root: # 第二层节点的标签名称和属性 print(child.tag,":", child.attrib) # 遍历xml文档的第三层 for children in child: # 第三层节点的标签名称和属性 print(children.tag, ":", children.attrib)
可以通过下标的方式直接访问节点
1 2
# 访问根节点下第一个country的第二个节点year,获取对应的文本 year = root[0][1].text # 2008
# 过滤出所有neighbor标签 for neighbor in root.iter("neighbor"): print(neighbor.tag, ":", neighbor.attrib)
1 2 3 4 5 6 7
# 遍历所有的counry标签 for country in root.findall("country"): # 查找country标签下的第一个rank标签 rank = country.find("rank").text # 获取country标签的name属性 name = country.get("name") print(name, rank)
4.4修改xml结构
属性相关
1 2 3 4 5 6 7 8 9 10 11
# 将所有的rank值加1,并添加属性updated为yes for rank in root.iter("rank"): new_rank = int(rank.text) + 1 rank.text = str(new_rank) # 必须将int转为str rank.set("updated", "yes") # 添加属性