07 文件操作

2019-11-03  本文已影响0人  武漂的小丙

1 文件操作

1.1 前提条件

1.2 操作步骤

# 绝对路径
# 什么编码方式存的文件,就以什么编码方式打开
f = open('d:/test.txt', mode='r', encoding='utf-8')
s = f.read()
print(s)
f.close()

1.3 只读

1.4 只写

1.5 追加

在文件末尾追加内容

1.6 组合操作

1.6.1 r+ 和 r+b模式

1.6.2 w+ 和 w+b 模式

只要是w,都是先清除后再写。

该模式不太常用

f.seck(0) 调节光标

1.6.3 a+ 和 a+b 模式

write始终是追加在最后

但是多一个读的动作,可以将光标移到指定位置去读

f = open('./ddd.log', mode='a+', encoding="utf-8")
f.seek(0)
f.write('读读')
s = f.read()
print(s)
f.close()

2 功能

2.1 read 读

# ddd.log 的内容:
# aa啊啊拜托啊啊
# 读出来:aa啊
f = open('./ddd.log', mode='r+', encoding="utf-8")
s = f.read(3)
print(s)
f.close()

2.2 seek 定光标

# ddd.log 的内容:
# aa啊啊拜托啊啊
# 读出来:a啊啊拜托啊啊
f = open('./ddd.log', mode='r+', encoding="utf-8")
f.seek(1)
s = f.read()
print(s)
f.close()

2.3 tell 获取光标位置

f = open('./ddd.log', mode='r+', encoding="utf-8")
f.seek(1)
print(f.tell())
s = f.read()
print(s)
print(f.tell())
f.close()
f = open('./ddd.log', mode='a+', encoding="utf-8")
f.write('追加')
count = f.tell()
f.seek(count - 3 * 3)
s = f.read()
print(s)
f.close()

2.4 readline 和 readlines

f = open('d:/test.txt', mode='r+', encoding="utf-8")
line1 = f.readline()
print(line1)
line2 = f.readline()
print(line2)
# 输出list 
lines = f.readlines()
print(lines)
f.close()

输出结果如下:

订立当当。葫芦娃abccccc

【接入计费出账】

['计划于10月28日进行\n', '影响:\n', '支持接入\n', '上线的时候\n', '计划上线。\n']

2.4 其他功能

3 其他技巧

(1) 使用with:

with open('d:/test.txt', mode='r+', encoding="utf-8") as f1,\
        open('./ddd.log', mode='r+', encoding="utf-8") as f2:
    print(f1.readlines())
    print('.................................')
    print(f2.readlines())

输入结果如下:

['订立当当。葫芦娃abccccc\n', '【Billing支持CFS接入计费出账】\n', '计划于10月28日进行Billing模块升级上线\n', '变更影响:\n', '支持CFS接入计费,后台模块,预计对客户无感,计费流延迟5分钟内\n', '上线的时候,bp-usage会有port报警,相关告警请忽略\n', '计划上线开始时间:2019年10月28日18:00,预计结束时间19:00。\n']
.................................
['aa啊啊插入啊啊追加\n', 'eeeee\n', 'ddfdd']

(2) 删除和重命名文件:

import os
os.remove(filename)
os.rename(oldfilename, newfilename)

4 小练习

先注册,将注册的用户名和密码写入文件。注册完成后在登录,登录从文件中读出来校验,给三次机会。

#-*- coding:utf-8 -*-
__author__ = 'xiao33x'

import getpass

# 根据用户名和密码判断用户是否存在
def getUser(uname=None, upwd=None):
    with open('注册.txt',mode='a+', encoding="utf-8")  as f:
        f.seek(0)
        while 1:
            # 依据大小来获取每次读取的行数,在IO和内存寻找平衡点
            lines = f.readlines(10)
            # print(lines)
            if not lines:
                break
            for line in lines:
                # 记得要把‘\n’给去掉
                line = line.replace('\n','')
                fname, fpwd = line.split('=')
                print('fname:', fname, ';  fpwd:', fpwd)
                if upwd != None and uname == fname and upwd == fpwd:
                    return True
                elif upwd == None and uname == fname:
                    return True
    return False


# 添加用户
def addUser(uname=None, upwd=None):
    with open('注册.txt',mode='a+', encoding="utf-8")  as f:
        # 因为a+会直接把光标放在最后,所以先加光标放在前面来
        f.seek(0)
        while 1:
            # 依据大小来获取每次读取的行数,在IO和内存寻找平衡点
            lines = f.readlines()
            # print(lines)
            if not lines:
                break
            for line in lines:
                fname, fpwd = line.split('=')
                # print('fname:', fname, ';  fpwd:', fpwd)
                if uname == fname:
                    print('用户已存在')
                    return False
        f.write('{name}={pwd}\n'.format(name=uname, pwd=upwd))
    print('注册成功')
    return True


if __name__ == '__main__':
    fileStr = '{name}={pwd}'
    while 1:

        print('''\
        1. 注册:
        2. 登录:
        3. 退出''')
        op = input('请选择你的操作:')
        if op == '3':
            print('已结束!')
            break
        if op ==  '1':
            name = input('用户名:')
            pwd = ''
            cpwd = ''
            while 1:
                pwd = getpass.getpass('密码:')
                cpwd = getpass.getpass('确认密码:')
                if pwd == cpwd and pwd != '':
                    break
                else:
                    print('两次密码输入不一致!')
            addUser(name, pwd)
        if op == '2':
            name = input('用户名:')
            pwd = getpass.getpass('密码:')
            existUser = getUser(name, pwd)
            if existUser:
                print('登录成功!')
            else:
                print('登录失败!')


上一篇下一篇

猜你喜欢

热点阅读