前言:
python文件操作和c语言类似,有open、close等接口。有r、w、a等读写模式
1- 文件打开关闭
语法:
#文件打开
文件句柄 = open(文件路径, 读写模式)
#文件关闭
文件句柄.close()
示例:
import os
file_name = "log.txt"
try:
file = open(file_name, 'w+')
except OSError as e:
print("open file fail")
else:
print("open file succ")
#读写文件
file.write("hello")
file.seek(0, 0)
content = file.read()
print(content)
file.close()
按文件路径打开文件
fname = r'D:\code\python\fname.txt'
f = open(fname, 'a+')
f.write("path file")
f_pos = f.seek(0, 0)
print(f_pos)
content = f.read()
print(content)
f.close()
实际过程中,如果文件存在,打开文件常使用 with open() as 文件句柄的方式。这样写是因为with open as的方式自动给我们关闭文件,不用自己手动调用close接口。
import os
file_name = "log.txt"
try:
with open(file_name, 'w+') as file:
#读写文件
file.write("hello")
file.seek(0, 0)
content = file.read()
print(content)
except OSError as e:
print("open file fail")
2- 文件读写模式
基本的读写模式只有读r、写w,在此基础上衍生出a、x两种模式,在读写模式基础上可以附加+和b两种标志。
读写模式:
r:只读(不可写)方式打开,如果文件不存在,报错。
w:写入(不可读)模式打开,如果文件不存在则创建。写入的内容会覆盖掉原有内容(文件打开后内容被清空)。
a:以追加(不可读)方式写文件,如果文件不存在则创建。不会覆盖原有内容,新内容写在文件末尾。特殊的w
x:以独占方式打开文件,如果文件已存在则抛异常,如果文件不存在则创建(以写模式(不可读)打开)。(不常用)
附加与读写模式的标志:
b:二进制文件需加上此选项。rb、wb、ab、xb
+: 更新文件。即文件以读写方式打开。例如r+、w+都可以以读写方式打开。
r+:以读写方式打开文件,如果文件不存在则抛异常,和r一样。写文件则以追加方式写。如果不加+,只可读不可写文件。
w+:以读写方式打开文件,如果文件不存在则创建,写入的内容会覆盖掉原有内容(文件打开后内容被清空),和w一样。只是增加了可以读取文件的属性。
a+:以读写方式打开文件,如果文件不存在则创建,写入的新内容写在文件末尾,和a一样。只是增加了读属性。注意读取文件时,指针在文件末尾,是读不到东西的。
注意:
如果文件不存在创建的选项有:w、x(文件必须没有被其他文件打开)、a
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建文件 | + | + | + | + | ||
覆盖原有内容 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
示例:
自己修改下r、w、a、x和 +的组合试下效果
import os
file_name = "log.txt"
try:
file = open(file_name, 'r')
except OSError as e:
print("open file file")
exit(1)
try:
file.write('hello world\n ')
except OSError as e:
print("write file fail")
file.close()
exit(1)
#设置文件光标位置
position = file.tell()
print(position)
position = file.seek(0, 0)
print("file pos:{0}".format(position))
try:
content = file.read()
print("file contest:{0}".format(content))
except OSError as e:
print("open file fail")
file.close()
exit(1)
file.close()
书上给的示例如下,嵌套太多了
import os
file_name = "log.txt"
try:
file = open(file_name, 'r')
except OSError as e:
print("open file fail")
else:
print("open file succ")
#读写文件
try:
content = file.read()
print("file contest:{0}".format(content))
print("\n")
except OSError as e:
print("file read fail")
finally:
file.close()
如果要读写二进制文件,可以使用b的模式,但是写字符串是需要加上b'字符内容'。
import os
file_name = "log.txt"
try:
file = open(file_name, 'wb+')
except OSError as e:
print("open file file")
exit(1)
try:
file.write(b'hello world\n ')
except OSError as e:
print("write file fail")
file.close()
exit(1)
#设置文件光标位置
position = file.tell()
print(position)
position = file.seek(0, 0)
print("file pos:{0}".format(position))
try:
content = file.read()
print("file contest:{0}".format(content))
except OSError as e:
print("open file fail")
file.close()
exit(1)
file.close()
3- 文件读写接口
只列出不试验了,搬运自菜鸟教程
file.closed | 返回true如果文件已被关闭,否则返回false。 |
file.mode | 返回被打开文件的访问模式。 |
file.name | 返回文件的名称。 |
file.softspace | 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 |
序号 | 方法及描述 |
---|---|
1 | 关闭文件。关闭后文件不能再进行读写操作。 |
2 | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | 返回文件下一行。 |
6 | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | 读取整行,包括 "\n" 字符。 |
8 | 读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。 |
9 | 设置文件当前位置 |
10 | 返回文件当前位置。 |
11 | 截取文件,截取的字节通过size指定,默认为当前文件位置。 |
12 | 将字符串写入文件,返回的是写入的字符长度。 |
13 | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
4- os模块的文件操作方法
搬运自菜鸟教程
序号 | 方法及描述 |
---|---|
1 | 检验权限模式 |
2 | 改变当前工作目录 |
3 | 设置路径的标记为数字标记。 |
4 | 更改权限 |
5 | 更改文件所有者 |
6 | 改变当前进程的根目录 |
7 | 关闭文件描述符 fd |
8 | os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
9 | 复制文件描述符 fd |
10 | 将一个文件描述符 fd 复制到另一个 fd2 |
11 | 通过文件描述符改变当前工作目录 |
12 | 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 |
13 | 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 |
14 | 强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。 |
15 | os.fdopen(fd[, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
16 | 返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
17 | 返回文件描述符fd的状态,像stat()。 |
18 | 返回包含文件描述符fd的文件的文件系统的信息,像 statvfs() |
19 | 强制将文件描述符为fd的文件写入硬盘。 |
20 | 裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
21 | 返回当前工作目录 |
22 | 返回一个当前工作目录的Unicode对象 |
23 | 如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
24 | 设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
25 | 修改连接文件权限 |
26 | 更改文件所有者,类似 chown,但是不追踪链接。 |
27 | 创建硬链接,名为参数 dst,指向参数 src |
28 | 返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
29 | 设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
30 | 像stat(),但是没有软链接 |
31 | 从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
32 | 以major和minor设备号组成一个原始设备号 |
33 | 递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
34 | 从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。 |
35 | 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。 |
36 | 创建命名管道,mode 为数字,默认为 0666 (八进制) |
37 | os.mknod(filename[, mode=0600, device]) |
38 | 打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
39 | 打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
40 | 返回相关文件的系统配置信息。 |
41 | 创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
42 | os.popen(command[, mode[, bufsize]]) 从一个 command 打开一个管道 |
43 | 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
44 | 返回软链接所指向的文件 |
45 | 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。 |
46 | 递归删除目录。 |
47 | 重命名文件或目录,从 src 到 dst |
48 | 递归地对目录进行更名,也可以对文件进行更名。 |
49 | 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
50 | 获取path指定的路径的信息,功能等同于C API中的stat()系统调用。 |
51 | os.stat_float_times([newvalue]) |
52 | 获取指定路径的文件系统统计信息 |
53 | 创建一个软链接 |
54 | 返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
55 | 设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
56 | 返回唯一的路径名用于创建临时文件。 |
57 | 返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。 |
58 | 为创建一个临时文件返回一个唯一的路径 |
59 | 返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
60 | 删除文件路径 |
61 | 返回指定的path文件的访问和修改的时间。 |
62 | os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) 输出在文件夹中的文件名通过在树中游走,向上或者向下。 |
63 | 写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
64 | 获取文件的属性信息。 |
5- os.path的文件操作
方法 | 说明 |
---|---|
os.path.abspath(path) | 返回绝对路径 |
os.path.basename(path) | 返回文件名 |
os.path.commonprefix(list) | 返回list(多个路径)中,所有path共有的最长的路径 |
os.path.dirname(path) | 返回文件路径 |
os.path.exists(path) | 如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。 |
os.path.lexists | 路径存在则返回True,路径损坏也返回True |
os.path.expanduser(path) | 把path中包含的"~"和"~user"转换成用户目录 |
os.path.expandvars(path) | 根据环境变量的值替换path中包含的"$name"和"${name}" |
os.path.getatime(path) | 返回最近访问时间(浮点型秒数) |
os.path.getmtime(path) | 返回最近文件修改时间 |
os.path.getctime(path) | 返回文件 path 创建时间 |
os.path.getsize(path) | 返回文件大小,如果文件不存在就返回错误 |
os.path.isabs(path) | 判断是否为绝对路径 |
os.path.isfile(path) | 判断路径是否为文件 |
os.path.isdir(path) | 判断路径是否为目录 |
os.path.islink(path) | 判断路径是否为链接 |
os.path.ismount(path) | 判断路径是否为挂载点 |
os.path.join(path1[, path2[, ...]]) | 把目录和文件名合成一个路径 |
os.path.normcase(path) | 转换path的大小写和斜杠 |
os.path.normpath(path) | 规范path字符串形式 |
os.path.realpath(path) | 返回path的真实路径 |
os.path.relpath(path[, start]) | 从start开始计算相对路径 |
os.path.samefile(path1, path2) | 判断目录或文件是否相同 |
os.path.sameopenfile(fp1, fp2) | 判断fp1和fp2是否指向同一文件 |
os.path.samestat(stat1, stat2) | 判断stat tuple stat1和stat2是否指向同一个文件 |
os.path.split(path) | 把路径分割成 dirname 和 basename,返回一个元组 |
os.path.splitdrive(path) | 一般用在 windows 下,返回驱动器名和路径组成的元组 |
os.path.splitext(path) | 分割路径,返回路径名和文件扩展名的元组 |
os.path.splitunc(path) | 把路径分割为加载点与文件 |
os.path.walk(path, visit, arg) | 遍历path,进入每个目录都调用visit函数,visit函数必须有3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有文件名,args则为walk的第三个参数 |
os.path.supports_unicode_filenames | 设置是否支持unicode路径名 |