一、文件操作
-
总结
文件路径:存放文件的位置
编码方式:utf-8,gbk,unicode,etc.
操作方式:只读,只写,读写,写读(与读写不一样),追加,etc.
文件修改:文件是不可修改的,但是可通过追加的方式后重命名文件名的方式修改文件里面的内容 -
编码方式
- 文件的绝对路径
打开文件需要知道存放文件的具体位置以及文件名
f = open('D:\Python\study code\ms system https.txt', mode='r', encoding='utf-8')
# 以什么编码方式存储的文件,就要以该编码方式打开,否则会报错(绝对路径下)
content = f.read()
print(content) # 返回值为:MSFT bug server (即文件里面的内容)
f.close()
- 相对路径
打开文件只需要知道文件名即可操作
f = open('相对路径', mode='r', encoding='utf-8') # 只读:r
content = f.read()
print(content) # 返回值为:今天要放假吗? (即文件里面的内容)
f.close()
- 操作方式
- 只读:r 或 rb
f = open('相对路径', mode='r', encoding='utf-8') # 只读:r(其中mode可不写)
content = f.read() # open()函数内置已经将bytes类型转换为str的操作
print(content,type(content)) # 返回值为:今天要放假吗? <class 'str'>
f.close()
f = open('相对路径', mode='rb') # rb 非文字类文件,上传/下载/存储文件 bytes类型的形式不用列举编码方式
content = f.read()
print(content) # 返回值为:b'\xe4\xbb\x8a\xe5\xa4\xa9\xe8\xa6\x81\xe6\x94\xbe\xe5\x81\x87\xe5\x90\x97\xef\xbc\x9f'
f.close()
- 只写:w 或 wb
写(w):若没有此文件,则新创建文件,如创建文件"只写",并在文件处写入信息;
若有文件,则会将写入的信息代入该文件,并删除源文件的信息。
f = open('只写', mode='w', encoding='utf-8') # 只写:w
f.write('没有文件信息,写入文件信息') # 需要写入的内容
f.close()
# 返回值为:新建“只写”文件,并再次键入“没有文件信息,写入文件信息”信息
f = open('只写', mode='wb') # 只写:wb
f.write('如何先将dtr类型转换为bytes'.encode('utf-8')) # 返回值为:在“只写”文件写入信息
f.close()
# 在这里转为bytes的编码方式必须为文件保存时的编码类型,如下
f = open('只写', mode='wb') # 只写:w
f.write('如何先将dtr类型转换为bytes'.encode('gbk')) # 返回值结果会报错或无法打开文件
f.close()
- 读写:r 或 r+b
f = open('只写', mode='r+', encoding='utf-8')
print(f.read()) # 先读再写
f.write('\n文件的读写操作')
# 第一次写入的信息还没有读出来,故而只添加了信息在文件里面。
f.close()
f = open('只写', mode='r+', encoding='utf-8')
f.write('\n文件的读写操作') # 先写再读
print(f.read())
# 在读写的模式下先写再读的模式,写入的信息会从左至右开始按字符个数覆盖之前的信息
f.close()
- 写读:w 或 w+b
f = open('只写', mode='w+', encoding='utf-8')
f.write('文件的读写操作')
f.seek(0) # 调光标的位置
print(f.read()) # 返回值为:在写读的模式下,源文件全部清空后写入信息
f.close()
f = open('只写', mode='w+b') # 在“只写”文件里面编辑
f.write('文件的读写操作'.encode('utf-8'))
f.seek(0) # 调光标的位置
print(f.read()) # 返回值为:加入信息的bytes类型信息
f.close()
- 追加:a 或 a+
f = open('只写', mode='a', encoding='utf-8') # 追加:a
f.write(',追加信息') # 返回值:在源文件信息的基础上追加信息
f.close()
f = open('只写', mode='a+', encoding='utf-8')
f.write('文件的读写操作')
print(f.read())
f.close()
- 功能详细叙述
(a) read的功能
f.read() # 一次性读完所有内容
f.readable() # 是否可读
f.readline() # 一行一行的读
f.readlines() # 一次性读,每一行当作列表中的一个元素,添加到列表中。
f = open('相对路径', mode='r+', encoding='utf-8') # 只读:r
content = f.read(3) # 读取的内容是字符
print(content) # 返回值为:今天放
f.close()
f = open('相对路径', mode='r+', encoding='utf-8') # 只读:r
f.seek(3) # 从光标所在的位置开始读取
# seek()光标是按照字节定位的,一个英文一个字节,一个中文三个字节
content = f.read(3) # 读取的内容是字符
print(content) # 返回值为:天放假
f.close()
(b) 文件指针(光标)
f.tell() # 查询光标的位置
f.seek(local-6) # 从光标所在的位置开始读取
f.truncate(6) # 对源文件进行截取,文件中只保留了截取的内容
f = open('相对路径', mode='a+', encoding='utf-8')
f.write('人生若只如初见')
local = f.tell() # 查询光标的位置
f.seek(local-6)
content = f.read() # 读取的内容是字符
print(content) # 返回值为:初见(文件完整内容为“认识若只如初见”)
f.close()
- for 循环读取
f = open('相对路径', mode='r+', encoding='utf-8')
line = f.readline()
print(line)
for line in f: # 循环将“相对路径”文件里面的信息全部隔行打印
print(line)
f.close()
- with…as…:
打开,且不需要用到f.close()函数
f = open('相对路径', mode='r+', encoding='utf-8')
with open('相对路径', mode='r+', encoding='utf-8')as f:
print(f.read())
- 同时可以打开多个文件
f = open('相对路径', mode='r+', encoding='utf-8')
f1 = open('只写', mode='r+', encoding='utf-8')
with open('相对路径', mode='r+', encoding='utf-8')as f,\
open('只写', mode='r+', encoding='utf-8')as f1:
print(f.read())
print(f1.read())
- 文件修改
需要做删除文件、重命名文件这两步的操作。
格式如下:
import os
os.remove('文件名')
os.rename('新建好空文件的文件名','新文件名')
with open('list_of_name', encoding='utf-8') as f,open('list_of_name.back', mode='w', encoding='utf-8') as
例子
f1:
for line in f:
if '123456' in line:
line = line.replace('123456','123qwe')
print()
f1.write(line)
import os
os.remove('list_of_name') # 删除文件名
os.rename('list_of_name.back','list_of_name') # 修改文件名
- 练习:注册 -> 界面 -> 登录
username = input('please enter the name which you like:')
password = input('please enter the password which you like:')
with open('list_of_name', mode='r+', encoding='utf-8') as f:
f.write('{}\n{}'.format(username,password))
print('successful to register!')
lis = []
i = 0
while i < 3:
user = input('please enter your name:')
pass_wd = input('please enter your password:')
with open('list_of_name', mode='r+', encoding='utf-8') as f:
for line in f:
print(line)
lis.append(line)
if user == lis[0].strip() and pass_wd == lis[1].strip():
print('OK')
break
else:
print('username and password is error')
print(lis) # 返回值为:['Rose\n', '123456']
i += 1