文件基础知识
计算机有两种存储设备-内存储器和外存储器,虽然它们都是用来保存数据的,但无论外形还是特点都差别巨大。我们常见的硬盘属于外存储 器,而内存条就属于内存储器。
(内存条)内存储器 VS (硬盘)外存储器
存取速度快 VS 存取速度慢
容量小 VS 容量大
成本高 VS 成本低
文件的概念:
文件是磁盘上的一个指定位置,用来存储相关信息。它用于永久地将数据存储在非易失性的内存中(如:硬盘、U 盘、移动硬盘、光盘等)。将数据长期保存成文件,在需要的时候使用。
文件(File)大致分为文本文件和二进制文件两个大类。
一般来说,直接用记事本程序打开文件,如果里面是可读的文字就是文本文件,如果是一堆不知所云的乱码就是二进制文件。
(1)文本文件可以用文字处理软件建立和修改,以纯文本文件保存。
(2)二进制文件(Binary File):以二进制方式保存的文件。该文件不能用普通的编辑软件进行查看,存储空间占用小。
打开文件
使用Python内置函数open()可以打开指定的文件,用于对文件进行读取,修改或添加内容。open()函数的语法如下所示。
open(filename[,mode][,encoding])
open()函数公有8个参数,其中最常用的有3个,分别是filename(文件名称)、mode(文件打开模式)和encode(文件编码方式)。
其中filename是不可以省略的,其他参数都可以省略,省略时会使用默认值。默认方式打开文件Open()函数默认以只读方式打开文件,并且返回文件对象。打开文件代码如下所示。
例:
# 文件基本操作(open())
# 打开当前目录中的文件
file1 = open("myfile.txt")
file1.close()
# 指定完整路径file2 = open("D:\Programs\Python\Python37-32\myfile.txt")
file2.close()
使用打开模式
打开文件时如果不指定模式,那么默认为'r',以只读方式打开文件。此外,还可以显式指定打开模式 读取使用'r'、写入使用'w'、追加使用'a'。还可以指定以文本模式或二进制模式打开文件(处理非文本文件(例如:图像、exe)时使用)。打开文件使用打开模式的例子如下所示。
例:
# 文件基本操作(打开模式)
# 相当于'r'或'rt'
file1 = open("myfile.txt")
print("文件打开模式:",file1.mode)
file1.close()
# 以文本模式写入file2 = open("myfile.txt", 'w')
file2.close()
# 以二进制模式读写file3 = open("logo.jpg", 'r+b')
file3.close()
r:只读模式:
只读不可写
w:只写模式
只可写不可读,打开时自动清空原本的内容
a:追加模式
只写,不可读,打开时光标自动定在末尾,文档内容不会清空
r+:读写模式先读后写。
打开文档时不清空原内容,光标定位正在开始位置。读完后光标会移到文档末尾,所以写的时候是追加在文档最后的。不会覆盖原内容。如果以“r+”模式打开,但是先写后读,那么写入的内容会覆盖原内容,读取时从写结束位置开始读。如果原文档内容小于新写入的,那么全部被覆盖,读到的为空。如果原文档内容大于新写入的,那么读到的内容为原文档剩下的内容。
w+:写读模式先写后读。
打开文档即清空原内容,从文档开头写起,写完后光标自动移到文档末尾,此时进行读取,内容为空。需要将光标移到首位,f.seek(0)。如果以“w+”模式打开,先进行读操作,读到的内容也是为空,因为打开即被清空了。
a+:追加写读模式先写后读。
追加在原文档末尾,不会清空原内容,写完后光标移到文档末尾,此时进行读取,内容为空。需要将光标移到首位,f.seek(0)。如果以“a+”模式打开,先进行读操作,读到的内容也是为空,因为打开即把光标定位在文档末尾。
文件默认的编码依赖于平台。在Windows系统中,默认编码为“cp936”;在Linux系统中,默认编码为“UTF-8”。可以看到,不同平台上的默认编码是不一样的。所以如果依赖于默认编码,那么代码在不同平台上将会有不同表现。因此,当以文本模式处理文件时,强烈建议指定编码类型。使用文件编码的例子如下所示。
例:
# 文件默认编码
file1 = open("myfile.txt")
print("文件编码:",file1.encoding)file1.close()
# 打开文件时指定编码类型
file2 = open("myfile.txt",mode = 'r',encoding = 'utf-8')
file2.close()
关闭文件(close())
当完成对文件的操作时,需要适当地关闭,以释放与该文件绑定的资源,可以使用close()函数关闭文件。可以采取常规关闭方式、异常处理关闭方式和使用with语句关闭方式来关闭文件。(1)常规方式
使用close()方法来完成文件关闭工作,使用这种方式并不完全安全,因为在对文件执行某些操作时很有可能会引发IOError。一旦出错,代码将会退出而无法执行关闭文件的代码。
(2)异常处理
更安全的方式是使用try...finally块,这样,即使出现异常,也可以确保文件能够被正确地关闭。
(3)使用with语句
每次都要采用异常处理的try...finally来关闭文件,这样做代码有些繁琐。所以,Python 引入了with语句,这可以确保当with中的块退出时,文件被安全地关闭,该动作是在内部完成的。这样和try ... finally的效果是一样的,而且无需显式地调用close()。
# (1)常规方式
print("(1)常规方式。")
file1 = open("myfile.txt")
file1.close()
# (2)异常处理
print("(2)异常处理。")
try:
file2 = open("myfile.txt")
# 文件相关操作
finally:
file2.close()
# (3)使用with语句
print("(3)使用with语句。")
with open("myfile.txt") as file3:
# 文件相关操作,不用显示调用
close()pass
文件读写操作
文件读就是从文件中读出数据到内存中去;
文件写就是把内存中的数据写入文件中。
文件读操作:
Python的文本文件的内容读取,必须以读'r'模式打开文件,常用的有三种方法:read()、readline()、readlines()。
(1)read()
read()是最简单的一种方法,一次性读取文件的所有内容放在一个大字符串中,即存在内存中。read()函数可以传递参数来指定读取文件指定编码(encoding)的字符数,如果没有传递参数则表明读取并返回到文件尾部。
例:
# 文件基本操作(读文件read())
# 文件内容:“我们都喜欢Python。”
with open("myfile.txt",mode='r',encoding='utf-8') as file:
print(file.read(2))
print(file.read(1))
print(file.read(2))
print(file.read(6))
print(file.read(1))
(2)readline()
readline()逐行读取文本,结果是一个list。readline()采取逐行读取,所以占用内存少,同时速度比较慢。使用readline()读取文件的例子如下所示。
例:
# 文件基本操作(读文件readline())
# 文件内容:
# “我们都喜欢Python。”
# “我们一起学习Python。”
with open("myfile.txt",mode='r',encoding='utf-8') as file:
line = file.readline()
while line:
line =line.rstrip('\n')
print(line)
line = file.readline()
(3)readlines()
readlines()一次性读取文本的所有内容,结果是一个list。readlines()读取的文件内容,每行末尾都会带一个“\n”换行符(可以使用list.tstrip(‘\n’)去掉换行符)。readlines()一次性读取文本内容,速度比较快,但readlines()随着文本的增大,占用内存会越来越多。
例:
# 文件基本操作(读文件readlines())
# 文件内容:
# “我们都喜欢Python。”
# “让我们一起学习Python。”
with open("myfile.txt",mode='r',encoding='utf-8') as file:
for line in file.readlines():
line_print =line.rstrip('\n')
print(line_print)
文件写操作:
为了写入文件,需要以写'w'模式打开,追加则使用'a'或独占创建使用'x'。在使用'w'模式时需要小心,因为如果文件存在,则会进行覆盖,以前的所有数据都将被清除。如果要向文件追加内容,使用模式'a'。Python的文件写操作常用的方法有wirte()和writelines()。
(1)wirte()
wirte()把参数内容写到文件中,wirte()并不会在字符串后加上一个换行符。wirte()进行文件操作的例子如下所示。
例:# 文件基本操作(写文件write())# 写操作
with open("mynewfile.txt",mode='w',encoding='utf-8') as file:
file.write("We all like Python.")
# 换行file.write("\n")
file.write("Let's study Python together.")
# 换行 file.write("\n")
# 读操作
with open("mynewfile.txt",mode='r',encoding='utf-8') as file:
for line in file.readlines():l
ine_print =line.rstrip('\n')
print(line_print)
(2)writelines()
writelines()把多行内容写到文件中,参数可以是一个可迭代的对象、列表、元组等。使用writelines()进行写文件操作的例子如下所示。
例9-9:程序代码:
# 文件基本操作(写文件writelines())
# 写操作
list = ("我们都喜欢Python。","\n","让我们一起学习Python。","\n")
with open("mynewfile.txt",mode='a',encoding='utf-8') as file:
file.writelines(list)
# 读操作
with open("mynewfile.txt",mode='r',encoding='utf-8') as file:
for line in file.readlines():
line_print =line.rstrip('\n')
print(line_print)
文件目录操作
在Python 中,有一个os模块,也提供了许多便利的方法来管理文件和目录。
Os提供了创建目录、删除目录、删除文件、执行操作系统命令等方法,使用时必须导入os包。
1. remove()方法
remove()方法用于删除指定文件,一般都会结合os.path的exists()方法使用,即先检查该文件是否存在,再决定是否删除该文件。删除文件的例子如下所示。
例:
# 文件与目录操作(remove()方法)
import os
file_name = "mynewfile.txt"
if os.path.exists(file_name):
os.remove(file_name)
print(file_name + "文件删除成功!")
else:
print(file_name + "文件未找到!")
2.mkdir()方法
用mkdir()方法可以创建指定名称的目录。执行后会在当前目录创建对应的目录。但如果目录已经创建,执行时就会产生错误。所以一般要先检查该目录是否存在,再决定是否要创建该目录。例:
# 文件与目录操作(mkdir()方法)
import os
my_dir = "PythonDir"
if notos.path.exists(my_dir):
os.mkdir(my_dir)
print(my_dir + "目录创建成功!")
else:
print(my_dir + "目录已经存在!")
3.rmdir()方法
rmdir()方法可以删除指定目录,删除目录前必须先删除该目录中的文件。一般都会先检查目录是否存在,再决定是否要删除该目录。删除目录的例子如下所示。
例:
# 文件与目录操作(rmdir()方法)
import os
my_dir = "PythonDir"
if os.path.exists(my_dir):
os.rmdir(my_dir)
print(my_dir + "目录删除成功!")
else:
print(my_dir + "目录不存在!")
递归删除文件夹:
import shutil
shutil.rmtree('PythonDir')
4. system()
方法system()方法用来执行操作系统命令,例如:清除屏幕、创建“PythonDir”目录,复制myfile.txt文件到新建目录下,并更名为mynewfile.txt,最后用记事本打开该文件。具体代码如下所示。
例# 文件与目录操作(system()方法)
import os
# 获取当前路径
current_path =os.path.dirname(__file__)
# 清除屏幕
os.system("cls")
# 创建PythonDir目录
os.system("mkdir PythonDir")
# 复制文件
os.system("copy myfile.txt PythonDir\mynewfile.txt")
# 使用记事本打开mynewfile.txt文件
file_name =current_path + "\PythonDir\mynewfile.txt"
os.system("notepad " +file_name)
os.walk()方法
os.walk()用来搜索指定目录及其子目录,它会返回一个包含3个元素的元组(dirpath, dirnames, filenames):
dirpath:以字符串形式返回该目录下所有的绝对路径
dirnames:以列表形式返回每一个绝对路径下的目录
filesnames:以列表形式返回该路径下所有文件遍历目录的
例子如下所示:
import os
# 获取当前路径
current_path =os.path.dirname(__file__)
sample_tree =os.walk(current_path)
for dir_name,sub_dir,files in sample_tree:
print("文件路径:",dir_name)
print("目录列表:",sub_dir)
print("文件列表:",files) print()