文件的基本操作
操作文件的函数/方法
序号 | 函数/方法 | 说明 |
---|---|---|
01 | open函数 | 打开文件 |
02 | read方法 | 将内容读取到内存中 |
03 | write方法 | 将内容写入文件 |
04 | close方法 | 关闭文件 |
open
函数负责打开文件,并且返回文件对象;read
/write
/close
三个方法都需要通过文件对象来调用;
OPEN函数
打开文件的方式
open
函数默认以只读方式打开文件,并且返回文件对象;
访问方式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针指向文件的开头,这是默认方式。如果文件不存在,抛出异常。 |
w | 以只写方式打开文件。如果文件存在则被覆盖。如果文件不存在,创建新文件。若不添加内容,程序执行完文件内容为空。 |
a | 以追加方式打开文件。如果文件存在,文件指针指向文件的结尾。如果文件不存在,创建新文件进行写入。 |
r+ | 以读写方式打开文件。文件的指针指向文件的开头。如果文件不存在,抛出异常。 |
w+ | 以读写方式打开文件。如果文件存在则被覆盖。如果文件不存在,创建新文件。 |
a+ | 以读写方式打开文件。如果文件已存在,文件指向指向文件的结尾。如果文件不存在,创建新文件进行写入。 |
# 打开文件
file = open("README", "w", encoding="utf-8") # 以只写方式打开
# 修改文件
read = file.read() # 虽然只做了读了操作,但以只写方式打开还是会用空文件来覆盖该文件
print(read)
write = file.write("kaiyi")
print(write) # 输出'5',类似于len()函数,会对file.write()做int()统计字符数
# 关闭文件
file.close()
READ方法
open
函数的第一个参数是要打开的文件名(文件名区分大小写);推荐先将open和close写完,再写write方法;
如果文件存在,返回文件操作对象;如果文件不存在,抛出异常;
read
方法会一次性读入并返回文件的所有内容;
close
方法负责关闭文件,如果忘记关闭文件,会造成系统资源消耗,并且会影响后续对文件的访问;
方法执行后,会把文件指针移动到文件的末尾。
文件指针
文件指针标记从哪个位置开始读取数据。
第一次打开文件时,文件指针通常会指向文件的开始位置。当执行read
方法后,文件指针会移动到读取内容的末尾(默认移动到文件末尾);也就是说,当执行过一次read
,读取了所有内容后,文件指针会移动到文件末尾(默认情况),再次调用read
方法,就不会读取到任何内容。
READLINE方法
readline
方法一次只读取一行内容。方法执行后,会将文件指针移动到下一行,准备再次读取。
source = open("README", "r", encoding="utf-8") # open()方法
destination = open("README1", "w", encoding="utf-8")
number = 1
while True: # 永远进行循环
read = source.readline() # 读取source文件第一行
if not read: # 如果没有数据,则退出
break
write = destination.write(read) # write()方法
print("第%s次复制" % number) # 每次写入后控制台输出写入的次数
number += 1
source.close() # close()方法
destination.close()
EVAL函数
eval()
函数可以将字符串当成有效的表达式来求值并返回计算结果;
# 基本的数学计算
number = eval("1 * 5")
print(number) # 输出'5'
# 字符串重复
str = eval("'*' * 10")
print(str) # 输出'**********'
# 将字符串转换成列表
list = type(eval("[1, 2, 3, 4]"))
print(list) # 输出'<class 'list'>'
dict = type(eval("{'name': 'xiaoming', 'age': 18}"))
print(dict) # 输出'<class 'dict'>'
注意
eval("__import__('os').system('ls')") # 不要滥用eval,容易造成注入攻击
# 千万不要用eval函数直接转换input的结果,你永远不知道用户会输入什么
import os
os.system("ls") # 等同于这两条命令