一、python 中的文件对象
1、file 对象
文件对象不仅可以用来访问普通的磁盘文件,而且也可以访问任何其它类型抽象层面上的"文件"。 一旦设置了合适的"钩子",你就可以访问具有文件类型接口的其它对象,就好像访问的是普通文件一样。
(1)打开文件并创建 file 对象
open() 函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。模式和缓冲参数都是可选的,默认为只读模式打开文件。使用with即使发生错误可以关闭文件。
open() 成功执行并返回一个文件对象之后,所有对该文件的后续操作都将通过这个"句柄"进行
。file object = open(file_name [, access_mode][, buffering])
with open(file_name [, access_mode][, buffering]) as f:
各个参数的细节如下:
● file_name:是一个包含了你要访问的文件名的字符串值
。
● access_mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表,这个参数是非强制的,默认文件访问模式为只读(r)。
● buffering:如果buffering的值被设为0,就不会有寄存;如果buffering的值取1,访问文件时会寄存行;如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小;如果取负值,寄存区的缓冲大小则为系统默认。
(2)File 对象的属性
一个文件被打开后,会得到一个file对象,你可以得到有关该文件的各种信息。
以下是和file对象相关的所有属性的列表:
2、文件的读写操作
file 对象提供了一系列方法,能让我们的文件访问更轻松。
(1)write() 方法
write() 方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python
字符串可以是二进制数据,而不是仅仅是文字
。write()方法不会在字符串的结尾添加换行符('\n')
:fileObject.write(string);
被传递的参数是要写入到已打开文件的内容
。 例:# 打开一个文件 f = open("foo.txt", "w+",encoding='utf-8') f.write("可以 ,你做的很好!\n 6666\n") # 关闭打开的文件 f.close()
(2)read() 方法
read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
file Object.read([count]);
被传递的参数是要从已打开文件中读取的字节计数
。
该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾
。
例:# 打开一个文件 f = open("foo.txt", "r+",encoding='utf-8') str = f.read(); print("读取的字符串是 : ", str) # 关闭打开的文件 f.close()
(3)readline()方法
readline() 方法
读取打开文件的一行,包括行结束符,作为字符串返回
。它有一个可选的 size 参数, 默认为 -1, 代表读至行结束符.,如果提供了该参数,那么在超过 size 个字节后会返回不完整的行。
readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。# 打开一个文件 f = open("foo.txt", "r",encoding='utf-8') str = f.readline() print("读取的字符串是 : ", str) # 关闭打开的文件 f.close()
(4)readlines()方法
readlines() 会
读取所有(剩余的)行,然后把它们作为一个字符串列表返回,列表中的一项表示文件的一行
。它的可选参数 sizhint 代表返回的最大字节大小,如果它大于 0 ,那么返回的所有行应该大约有 sizhint 字节(可能稍微大于这个数字, 因为需要凑齐缓冲区大小)。# 打开一个文件 f = open("foo.txt", "r",encoding='utf-8') str = f.readlines() print("读取的字符串是 : ", str) # 关闭打开的文件 f.close()
3、文件定位操作
(1)tell() 方法
tell() 方法告诉你文件内的当前位置
;换句话说,下一次的读写会发生在文件开头这么多字节之后。
(2)seek() 方法
seek(offset [,from])方法
改变当前文件的位置
。Offset 变量表示要移动的字节数。From 变量指定开始移动字节的参考位置
。如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
例:
# 打开一个文件
f = open("foo.txt", "r+", encoding='utf-8')
str = f.read(10);
print("读取的字符串是 : ", str)
# 查找当前位置
position = f.tell();
print("当前文件位置 : ", position)
# 把指针再次重新定位到文件开头
position = f.seek(0, 0);
str = f.read(10);
print("重新读取字符串 : ", str)
# 关闭打开的文件
f.close()
4、文件刷新与关闭
(1)flush() 方法
flush() 方法会
直接把内部缓冲区中的数据立刻写入文件,而不是被动地等待输出缓冲区被写入
。
(2)close() 方法
close() 方法关闭文件来结束对它的访问。Python 垃圾收集机制也会在文件对象的引用计数降至零的时候自动关闭文件。
当一个文件对象的引用被重新指定给另一个文件时,Python 要关闭之前的文件。
良好的编程习惯要求在重新赋另个文件对象前关闭这个文件。如果你不显式地关闭文件,那么你可能丢失输出缓冲区的数据
。
二、对文件系统的访问:OS 模块
os 模块提供了多数操作系统的功能接口函数。当 os 模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件、目录打交道,这时就离不了 os 模块。
1、文件信息
(1)getatime()
返回最近访问时间
(2)getctime()
返回文件创建时间
(3)getmtime()
返回最近文件修改时间
(4)getsize()
返回文件大小(以字节为单位)
2、文件操作
(1)remove() 方法
删除文件
(2)rename() 方法
重命名文件
(3)mpfile() 方法
创建并打开(‘w+b’)一个新的临时文件
(4)os.path.isfile(path) 方法
判断是否是一个文件,如果是则返回True,否则返回False;
print(os.path.isfile('abc')) # True print(os.path.isfile('/test/qwe')) # False
3、目录、文件夹的操作
所有文件都包含在各个不同的文件夹或目录下,不过Python也能轻松处理。
(1)getcwd() 方法
getcwd()方法显示当前的工作目录。
os.getcwd()
(2)chdir() 方法
切换目录(路径)改变当前工作目录,通过一个文件描述符改变当前工作目录
import os os.chdir(r'/etc/sysconfig/') print(os.getcwd()) # /etc/sysconfig
(3)mkdir() 方法
可以使用os模块的mkdir()方法
在当前目录下创建新的目录
。你需要提供一个包含了要创建的目录名称的参数。os.mkdir("newdir")
(4)os.makedirs() 方法
生成一个
多层递归目录
os.makedirs('/home/test/xuan')
(5)rmdir()方法
rmdir()方法删除目录,参数传递目录名称。
在删除这个目录之前,它的所有内容应该先被清除,若目录不为空则无法删除,报错
。os.rmdir('dirname')
(6)os.removedirs() 方法
若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依次类推;
os.removedirs('test/xuan')
(7)os.listdir()
显示指定目录下,所有的文件和子目录,包括隐藏文件;
import os dirs = os.listdir('/root') print(dirs) ['.bash_logout', '.bash_profile', '.cshrc', '.tcshrc', '.bashrc', 'full_stack', 'jf_blog', 'node-v8.9.4-linux-x64', '.bash_history', '.config', '.npm', '.pki', '.ssh', '.gitconfig', '.oracle_jre_usage', '.cache', '.python_history', 'douban', 'mysql57-community-release-el7-10.noarch.rpm', '.mysql_history', '.viminfo'] ```
4、查询
(1)os.path.exists(path)
判断路径是否存在,如果path存在,返回True;如果不存在,返回Flase;
import os print(os.path.exists('/test/123/abc')) # True
(2)os.path.isdir(path)
判断是否是一个存在的目录;
import os print(os.path.isdir('/test/qwe')) # True print(os.path.isdir('/test/abc')) # False
(3)isabs()
指定路径是否为绝对路径
(4)islink()
指定路径是否存在且为一个符号链接
(5)ismount()
指定路径是否存在且为一个挂载点
(6)samefile()
两个路径名是否指向同个文件
5、访问/权限
(1)access()
检验权限模式
(2)chmod()
改变权限模式
(3)chown()
改变 owner 和 group ID/功能相同, 但不会跟踪链接
(4)umask()
设置默认权限模式
6、分隔
(1)basename()
去掉目录路径, 返回文件名
(2)dirname()
去掉文件名, 返回目录路径
(3)os.path.join(path1,[path2],[path3])
将路径和文件名分为一个列表中的两个元素,将它们拼起来,若其中有绝对路径,则之前的path将会被删除;
print(os.path.join('/test/','hello.txt')) # /test/hello.txt print(os.path.join('/test/123','hello.txt')) # /test/123/hello.txt
(4)split()
返回 (dirname(), basename()) 元组
(5)splitdrive()
返回 (drivename, pathname) 元组
(6)splitext()
返回 (filename, extension) 元组