Fork me on GitHub

7 文件操作

一 打开文件的方式

1  f = open('文件名或者文件路径',mode=‘打开方式’,encoding='utf8')

f.flush()

f.close()

2 with open('文件名或者文件路径',mode=‘打开方式’,encoding='utf8') as f,\

  open('文件名或者文件路径',mode=‘打开方式’,encoding='utf8')  打开多个文件方式

二 文件常用的操作方法

  • r  读取文件
open表示打开一个文件
f 变量, 操控胡辣汤.txt文件的句柄

f = open("胡辣汤", mode="r", encoding="utf-8")
读取文件中的内容
read(n) 读取n个字符
content = f.read(3)
content = f.read() # 一次性全都读取出来,占内存

line = f.readline() # 读取一行数据
print(line.strip()) # strip()去掉空白。空格, \t \n
line = f.readline() # 读取一行数据
print(line.strip())

lst = f.readlines() # 一次性全都读取出来, 返回的是列表包括换行符
print(lst)
R
  • w 写入文件

  特点: 先清空文件里面的内容再写入

W
f = open("黑猫记者", mode="w", encoding="utf-8") # w可以帮我们创建文件
# f.write("\n")
f.write("太黑\n")
f.write("很黑\n")
f.write("特别黑\n")
f.close()

  • a 追加模式

  特点:只能在文本末尾添加

  • b 模式

  特点:一般使用在图片,视频等非文字文件的操作

b - bytes 读取和写入的是字节 , 用来操作非文本文件(图片, 音频, 视频)
rb, wb, ab

# 把刘亦菲从d盘复制到g盘, 单纯的从bytes角度来复制的。 适用于所有文件
f1 = open(r"d:\刘亦菲.jpeg", mode="rb")
f2 = open(r"g:\刘亦菲.jpeg", mode="wb")

for line in f1: # 分批量的读取内容
    f2.write(line) # open()出来的结果可以使用read或者write. 根据mode来看

f1.close()
f2.close()
b
  • r+  读写, w+  写读, a+ 追加写读, r+b, w+b, a+b

  特点:一般

正常的
f = open("唐诗", mode="r+", encoding="utf-8")
content = f.read()
f.write("黄蓉")
print(content)

# 错误的示范
f = open("person", mode="r+", encoding="utf-8")
f.write("杨千桦") # 默认如果直接写入的话。 在开头写入。 覆盖开头的内容
content = f.read()
print(content)

# r+
# 坑: 不论你读取多少内容。再次写入的时候都是在末尾
f = open("唐诗", mode="r+", encoding="utf-8")
info = f.read(3)
f.write("胡辣汤")
print(info)
r+常见操作及坑
  • w+ 写读(不常用)
# w+
f = open("唐诗", mode="w+", encoding="utf-8") # 先清空。 然后再操作
f.write("你好。 我叫肿瘤君")#清空文件写入
f.seek(0)#移动光标可以读取
content = f.read() # 写入东西之后。 光标在末尾。 读取不到内容的
print(content)
f.close()
w+注意事项
  • a+ 追加写读
# a+, 不论光标在何处 写入的时候都是在末尾
f = open("唐诗", mode="a+", encoding="utf-8")
f.write("我叫李嘉诚") # 默认写在末尾
f.seek(0)#移动光标可以读取
content = f.read()#写入之后光标在最后不可读
print(content)
f.close()
View Code

三 文件中几个操作方法

  1. seek(参数1,参数2)移动光标
    参数1 表示的是偏移量,移动多少个单位
    参数2 表示从什么位置进行偏移
      0: 光标移动到开头
      1: 当前位置
      2: 光标移动到末尾
    f.seek(3) # 以字节为单位
    info = f.read(3) # 读取三个字符

  2
tell() 程序返回当前光标的位置
   3  truncate() 截断文件. 慎用按字节截取

  四 文件的修改

import os # 导入os模块

import time # 时间模块

# 优点:不用关闭句柄, 自动关闭连接
with open("唐诗", mode="r", encoding="utf-8") as f1,\
    open("唐诗_副本", mode="w", encoding="utf-8") as f2:
    for line in f1:
        line = line.replace("善良", "sb")
        f2.write(line)

time.sleep(5)
os.remove("唐诗") # 删除源文件
time.sleep(5)
os.rename("唐诗_副本", "唐诗") # 把副本改名成源文件
View Code
  • 文件修改的一道练习
6,文件a1.txt内容

序号 部门 人数 平均年龄 备注
1 python 30 26 单身狗
2 Linux 26 30 没对象
3 运营部 20 24 女生多
通过代码,将其构建成这种数据类型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
with open('ax', mode='r', encoding='utf8') as f:
    lis1=[]
    lis2=[]
    line1=f.readline()
    line1=line1.strip().split(' ')
    for i in line1:
        if i is not '':
            lis2.append(i)
    # print(lis2)
    for line in f:
        lis3 = []
        dic = dict()
        line=line.strip().split(' ')
        print(line)
        for m in line:
            if m is not '':
                lis3.append(m)
        # print(lis3)
        for i in range(len(lis2)):
            dic[lis2[i]] = lis3[i]
        lis1.append(dic)
print(lis1)
View Code

 7 用户注册登陆

# 12,写一个函数完成三次登陆功能,再写一个函数完成注册功能(升级题)

def register():
        while 1:
            with open('账号密码', 'r+', encoding='utf8') as f:
                name = input('用户名:')#打开文件注意一般在循环里面
                password = input('密码:')#因为光标会随着for循环移动
                for line in f:                    #导致光标前面的内容无法检测
                    # print(line.strip())      #可以用seek函数移动光标
                    # line = line.strip().split(':')
                    # if line[0] == name:
                    if line.strip().split(':')[0] == name:
                        print('该用户已经注册,请重新注册')
                        break
                else:
                    # f.seek(0,2)
                    f.write(name+':'+password+'\n')
                    print('完成注册')
                    break
register()

def land():
    m = 3
    # with open('账号密码',encoding='utf8') as f:
    while m > 0:
        with open('账号密码', encoding='utf8') as f:
            name = input('输入用户名:').strip()
            passwrd = input('输入密码:').strip()
            for line in f:
                line = line.strip().split(':')
                if line[0] == name and line[1] == passwrd:
                    print('登陆成功')
                    m = 0
                    break
            else:
                m -= 1
                print('用户名或者密码错误还有%s次机会'% m)
land()                                                
函数

 

posted @ 2018-10-26 20:20  FightinGu  阅读(244)  评论(0编辑  收藏  举报