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)
浙公网安备 33010602011771号