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)

 

posted on 2018-08-18 22:02  安小小  阅读(175)  评论(0)    收藏  举报

导航