一:文件操作必需
- 文件的路径
可以是相对路径,也可以是绝对路径
- 文件的编码
文件的存储和打开编码必需一样
- 操作动作
动作用 r w a
二:文件操作
2.1 读操作
- read 是将文件的内容全部读取
- readline 每次只读取文件一行内容
- 读取的时候要注意要分批区读,如按每行去读
- 每行读取的内容包括换行符,如果在打印时 print也会加上换行符,所以可以将每次读取的内容strip然后再打印
- 文件时可迭代对象,可以被for循环
2.1.1 r操作
# read会一次性的读取文件内容
f = open('wangys',mode='r',encoding='utf-8')
ret = f.read()
print(ret)
# readline每次读取一行内容,读取的包括换行符
# 内容包括换行符
# 如果不做处理,会将换行符打印出来
f = open('wangys',mode='r',encoding='utf-8') ret = f.readline() print(ret) ret = f.readline() print(ret) # name age
# 对换行符做strip处理
f = open('wangys',mode='r',encoding='utf-8') ret = f.readline().strip() print(ret) ret = f.readline().strip() print(ret)
#
name
age
# 推荐读的方式,一行一行的读取 f = open('wangys',mode='r',encoding='utf-8') for line in f: print(line.strip())
打开方式:rb 常用于非文字文件,上传下载
2.2 写操作
- 如果文件存在,则清空文件,如果不存在,则创建
- 默认不会加换行符,如果需要换行,则需要加换行符
2.2.1 w
f = open('lala',mode='w',encoding='utf-8') f.write('haha') f.close()
打开方式:wb 注意encode
f = open('lala',mode='wb') f.write('撒旦飞洒地方'.encode('utf-8')) f.close()
2.3 追加
- 需要文件事先存在
- 追加内容到文件
打开方式:a
f = open('lala',mode='wb') f.write('撒旦飞洒地方'.encode('utf-8')) f.close() f = open('lala',mode='a',encoding='utf-8') f.write('谁说的') f.close()
打开方式: ab
f = open('lala',mode='ab') f.write('我说的'.encode('utf-8')) f.close()
2.4 读写
用的最多
打开方式: r+ 如果是先读后写,是追加效果(读完后光标移到了最后,写追加到了最后),如果是写读,会有覆盖效果(光标在首位置,然后写)
f = open('lala',mode='r+',encoding='utf-8') print(f.read()) f.write('真的')
f = open('lala',mode='r+',encoding='utf-8') f.write('假的') print(f.read()) f.close()
打开方式 r+b
f = open('lala',mode='r+b') print(f.read()) f.write('你好啊'.encode('utf-8')) f.close()
三:其他操作
3.1 按字符读取
- read是按照字符来读取的
wangys f = open('wangys_info',mode='r+',encoding='utf-8') data = f.read(3) print(data) f.close()
3.2 seek
- seek第一个参数是偏移量,第二个参数是位置
- seek(0)移动到开始位置
- seek(0,2) 移动到文件结束位置
- seek是按字节来移动的位置的
f = open('wangys_info',mode='r+',encoding='utf-8') f.seek(3) print(f.read()) f.close()
3.3 tell
- 告诉我们光标的位置
- 单位为bytes
王诚的博客 f = open('wangys_info',mode='r+',encoding='utf-8') print(f.read()) print(f.tell()) f.close()
通过seek跟read读取指定的内容
读取博客
f = open('wangys_info',mode='a+',encoding='utf-8') f.write('博客') f.seek(f.tell()-6) print(f.read())
3.4 readline readlines
readline 一行一行读
王诚 博客 f = open('wangys_info',mode='r+',encoding='utf-8') line = f.readline() print(line) f.close()
readlines
将读取的的每一行内容当作列表的元素放入一个列表中
f = open('wangys_info',mode='r+',encoding='utf-8') lines = f.readlines() print(lines) f.close()
3.5 通过文件句柄将文件所有内容读取出来
f = open('wangys_info',mode='r+',encoding='utf-8') for line in f: print(line) f.close()
3.6 使用with打开文件
with open('wangc',mode='r+',encoding='utf-8') as f1, open('wangys',mode='r+',encoding='utf-8') as f2: print(f1.read()) print(f2.read())
3.7
用户注册登录
register_user_name = input("请输入你要注册用户名").strip() register_password = input("请输入密码").strip() with open('user_list',mode='w',encoding='utf-8') as register_f: register_f.write('{} {}'.format(register_user_name,register_password)) print('您注册成功') count = 0 user_list=[] while count < 3: login_user = input("请输入你要登录的用户名称").strip() login_pwd = input("请输入你登录的密码").strip() with open('user_list',mode='r+',encoding='utf-8') as judge_login_user: for line in judge_login_user: user_list.append(line) if login_user == user_list[0].strip() and login_pwd == user_list[1].strip(): print('登录成功') break else:print('用户名密码错误') count+=1
3.8 文件内容修改
wangys_info文件 将文件里的wangys替换为王诚
姓名:wangys 性别:男 import os with open('wangys_info',encoding='utf-8') as f1, open('wangys_info.bak','w',encoding='utf-8') as f2: for line in f1: if "wangys" in line: line=line.replace('wangys','王诚') f2.write(line) os.remove('wangys_info') os.rename('wangys_info.bak','wangys_info')
3.9 简单的日志处理
id,name,age,sex 1,wangys,18,male 2,mengsx,18,female 3,caomei,0.5,male
log=[] with open('info',mode='r',encoding='utf-8') as f: first_line_list = f.readline().strip().split() for line in f: dic = {} for index in range(len(first_line_list)): dic[first_line_list[index]] = line.strip().split()[index] log.append(dic) print(log)