python 文件操作
一、文件的读:
1、只读
绝对路径
# f = open(\'H:\python\金刚葫芦娃.txt\', mode=\'r\', encoding=\'gbk\') # content = f.read() # print(content) # f.close()
相对路径 (文件以什么编码方式储存,就以什么编码方式打开)
# f = open(\'金刚葫芦娃\', mode=\'r\', encoding=\'utf-8\') # content = f.read() # print(content, type(content)) # 里面默认有一个bytes--->str的转化 # f.close()
以bytes类型操作的只读
# f = open(\'金刚葫芦娃\', mode=\'rb\',) # 以bytes类型打开文件 # content = f.read() # print(content, type(content)) # f.close()
2、读写
# f = open(\'fl2\', mode=\'r+\', encoding=\'utf-8\') # print(f.read()) # f.write(\'小粉嫩\') # f.close() # r+下可写可不写 # f = open(\'fl2\', mode=\'r+\', encoding=\'utf-8\') # print(f.read()) # f.close() # r+模式下的写读 # f = open(\'fl2\', mode=\'r+\', encoding=\'utf-8\') # f.write(\'小粉嫩\') # 写的时候光标在第一位 你写多少占多少位剩下的保留 # print(f.read()) # 写完读出来的是没有写到/占到的内容 # f.close() # f = open(\'fl2\', mode=\'r+b\') # print(f.read()) # f.write(\'life is short\'.encode(\'utf-8\')) # f.close()
二、文件的写
1、只写
# f = open(\'fl1\', mode=\'w\', encoding=\'utf-8\') # f.write(\'life is short, I love python\') # f.close() # 如果文件存在 write 会先把愿文件里面的东西全部删除,再往进写 # f = open(\'fl1\', mode=\'w\', encoding=\'utf-8\') # f.write(\'Everything I Never Told You\') # f.close()
2、以bytes类型操作的只写
# f = open(\'fl1\', mode=\'wb\') # 文件本身就是bytes类型 所以不用 encoding... # f.write(\'无声告白\'.encode(\'utf-8\')) #原文件是什么编码类型往进写的就用什么类型 # f.close()
3、写读
# f = open(\'fl2\', mode=\'w+\', encoding=\'utf-8\') # 只要有w都先清除再写 # f.write(\'Everything I Never Told You\') # f.seek(2) # 调光标 有了这个时候读出来的才不会是空 # print(f.read()) # f.close()
三、文件的追加
# f = open(\'fl2\', mode=\'a\', encoding=\'utf-8\') # f.write(\'小马哥\') # f.close() # f = open(\'fl2\', mode=\'a+\', encoding=\'utf-8\') # f.write(\'小马哥\') # f.seek(0) # print(f.read()) # f.close()
四、功能详解
# f = open(\'fl2\', mode=\'r+\', encoding=\'utf-8\') # count = f.read(5) # f.seek(3) # 按照字节定光标位置 # f.tell() # 告诉你光标位置在哪儿 # print(f.tell()) # f.readable() # 判断是否可读 # print(f.readable()) # count = f.read(5) # 读几个 读出来的都是字符 # print(count) # f.close() # f = open(\'fl2\', mode=\'a+\', encoding=\'utf-8\') # f.write(\'小马哥\') # f.tell() # f.seek(f.tell()-6) # 一个汉字占三个字节 # print(f.read()) # 马哥 # print(f.read(1)) # 马 # f.close() # f = open(\'fl2\', mode=\'r+\', encoding=\'utf-8\') # l1 = f.readline() # 一行一行的读 # l2 = f.readlines() # 每一行当成是列表中的一个元素 添加到list 里面 # print(l1) # print(l2) # f.truncate(3) # 在原文件中进行截取 # for line in f: # 循环打印文件中的每一行即读取整个文件 # print(line) # f.close()
五、with
# with open(\'fl2\', mode=\'r+\', encoding=\'utf-8\') as obj: # 读取整个文件 若果文件太大需要分布去读 # print(obj.read()) # 自动关闭文件 不用f.close() # 同时打开两个文件 # with open(\'fl2\', mode=\'r+\', encoding=\'utf-8\') as f,\ # open(\'fl2\', mode=\'r+\', encoding=\'utf-8\') as f1: # # print(f.read()) # print(f1.read())
六、文件的修改
文件的数据是存放在硬盘上的,因而只存在覆盖,不存在修改这么一说,我们平时看到的修改文件都是模拟出来的效果,具体地说
有如下两种方法:
1. 将硬盘存放的该文件的内容全部加载到内存,在内存中是可修改的,修改完成后再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
# import os # 调用系统模块 # # with open(\'a.txt\') as read_f, open(\'.a.txt.swap\', \'w\') as write_f: # data = read_f.read() # 全部读入内存,如果文件很大,会很卡 # data = data.replace(\'jack\', \'SB\') # 在内存中完成修改 # write_f.write(data) # 一次性写入新文件 # os.remove(\'a.txt\') # 删除原文件 # os.rename(\'.a.txt.swap\', \'a.txt\') # 将新建的文件重命名为原文件
2.将硬盘存放的该文件的内容一行一行的读入内存,修改完毕就写入新文件,最后用新文件代替原文件。
# import os # # with open(\'a.txt\') as read_f, open(\'.a.txt.swap\', \'w\') as write_f: # for line in read_f: # line = line.replace(\'barry\', \'lucy\') # write_f.write(line) # os.remove(\'a.txt\') # os.rename(\'.a.txt.swap\', \'a.txt\')
七、简单注册登录
user_name = input(\'请输入您要注册的用户名:\').strip() pass_word = input(\'请设置您的密码:\').strip() with open(\'list_of_info\', mode=\'w+\', encoding=\'utf-8\') as fl1: fl1.write("{}\n{}".format(user_name, pass_word)) print("注册成功!请登录!") i = 0 l1 = [] while i < 3: username = input("请输入你您的用户名:").strip() password = input("请输入您的密码:").strip() with open(\'list_of_info\', mode=\'r+\', encoding=\'utf-8\') as fl1: for line in fl1: l1.append(line.strip()) if username == l1[0].strip() and password == l1[1].strip(): print("登陆成功!") break else: print("账户名或密码错误!") i += 1
八、练习题
需求:
# apple 10 3
# tesla 100000 1
# mac 3000 2
# lenovo 30000 3
# chicken 10 3
# 通过代码,将其构建成这种数据类型:
# [{\'name\':\'apple\',\'price\':10,\'amount\':3},{\'name\':\'tesla\',\'price\':1000000,\'amount\':1}......]
# 并计算出总价钱。
li = [] sum = 0 with open(\'b.txt\', mode=\'r+\', encoding=\'utf-8\') as fl1: for i in fl1: li1 = i.strip().split() dic = {\'name\': li1[0], \'price\': li1[1], \'amount\': li1[2]} li.append(dic) print(li) # for 循环实现求总价 # for dic in li: # sum += int(dic[\'price\']) * int(dic[\'amount\']) # print(sum) # while 循环计算总价 i = 0 sum1 = 0 while i < len(li): sum1 = sum1 + int(li[i][\'price\']) * int(li[i][\'amount\']) i = i + 1 print(sum1)