一、文件操作
1、 open 打开
f = open(文件路径,mode = ”模式“,encoding = ”编码格式“)最底层的操作就是bytes
encoding 表示编码集,根据文件的实际保存编码进行获取数据,对于我们而言更多的是utf-8,记事本的编码格式是GBK。
打开一个文件时,获取到的是一个文件句柄。通过文件句柄就可以对文件进行操作了,根据打开方式不同,能够执行的操作也会有相应的差异。
# r : read 只读 f = open("大猩猩.txt",mode = "r", encoding = "utf-8") # 读取内容 f1 = f.read() # 全部都读取出来 print(f) f2 = f.read() # 读取不到内容,上边已经读取完毕,光标在末尾 print(f2) # 关闭连接 f.close()
相对路径: 相对于当前目录所存在的文件夹
../ 上一层文件
文件夹/ 进入xxx文件夹
绝对路径: 从磁盘根目录开始一直到文件名。
推荐使用相对路径,在我们把程序拷贝给别人的时候,直接把项目拷贝走就能运行,但如果是绝对路径,还需要拷贝用到的外部文件。
日志:程序运行过程中记录得信息。一般保存在绝对路径。
2、mode (模式)
r : 读取,只读
读取文件的方式
1、read() 默认读取文件的全部内容。弊端:占内存。如果文件过大,容易导致内存奔溃。
2、read(n) 读取n个字符。注:如果再次读取,会在当前位置继续去读,而不死从头再读。
3、readline() 一次读取一行数据。 注:readline()结尾,每次读取的数据都会有一个 \n 结尾,需要使用strip()方法去
掉 \n 或者空格
4、readlines() 将每一行形成一个元素,放到一个列表中,将所有的内容都读取出来。文件过大时,容易内存崩溃。
5、循环读取。最重要,最好用。每次读取一行内容。不会产生内存溢出的问题
for line in f:
注:读取完的文件句柄一定要关闭 f.close()
w: 写,只是写
写的时候,如果没有文件,则会创建文件;如果文件存在,则将原件中原来的内容删除,再写入新的内容
写入完成后,需要刷新管道 f.flush()
f = open('梦想', mode = 'w', encoding = 'utf-8') f.write('好声音\n') f.write('奇葩说\n') f.write('逻辑思维') f1 = f.read() print(f1) # 报错:not readable f.flush() f.close()
a :
将内容追加写到末尾,也可以创建文件
f = open('心门', mode = 'a', encoding = 'utf-8') f.write('好声音\n') f.write('奇葩说\n') f.write('逻辑思维') f.flush() f.close()
r+ :
读写,先读后写,使用频率比较高。
注:不论读取内容的是多少,只要读了,写入就是从末尾开始。
w+:
开始就是清空文件。一般不会用
所有带b 的表示直接操作的时bytes,处理非文本文件的时候。
rb
wb
ab:断点续传, 比如在下载文件的时候中断,下次下载的时候,从断点,继续下载。
a+: 追加读,不论是先读还是后读,都读取不到数据。
r + b w + b a +b 写病毒的时候可以用到。
3、文件操作中关于句柄的相关操作
seek() 移动光标
f.seek(0) 移动到开头
f.seek(0,2) 移动到末尾
seek 的两个参数: 1、表示偏移量 2、从xxx开始偏移,默认位0,指开头。 1,指当前位置 2,末尾
注: 移动的单位都是bytes,所以如果是utf-8的中文部分要是3的倍数。
tell() 返回光标所在的位置
truncate(canshu)
1、如果给了参数,从头截取到参数位置
2、如果不给参数,从头截取到光标
4、修改文件中的字段
步骤:
1、先从文件中读取内容
2、把要修改的内容进行修改
3、把修改好的内容写到一个新文件
4、删除掉原来的文件
5、把新文件重命名成原来的文件名
import os f1 = open('心门', mode='r', encoding='utf-8') f2 = open('心门_副本', mode='w', encoding='utf-8') for line in f1: if '好' in line: line = line.replace('好','真的非常好,及其好') f2.write(line) f1.close() f2.flush() f2.close() # time.sleep(3) # 删除源文件 os.remove("心门") # 将新的文件重命名为原来的文件 os.rename('心门_副本','心门')
import os with open('心门', mode='r',encoding='utf-8') as f1 ,\ open('心门_副本', mode='w',encoding='utf-8') as f2: for line in f1: if '好' in line: line = line.replace('好','真的非常好,及其好') f2.write(line) # time.sleep(3) os.remove('心门') os.rename('心门_副本','心门')
a1.txt 内容如下: name:apple price:10 amount:3 year:2012 name:tesla price:100000 amount:1 year:2013 name:mac price:3000 amount:2 year:2014 name:lenovo price:30000 amount:3 year:2015 name:chicken price:10 amount:3 year:2016 通过代码,将其构建成这种数据类型: [{'name':'apple','price':10,'amount':3}, {'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。 ''' with open('a2.txt', mode='r', encoding='utf-8') as f: lst = [] sum = 0 for line in f: line = line.strip().split(' ') dic = {} for c in line: c = c.split(':') if c[0] =='price' or c[0] =='amount': dic[c[0]] = int(c[1]) else: dic[c[0]] = c[1] sum += dic["price"] * dic["amount"] lst.append(dic) print(lst) print(sum)