使用File操作文件
open(file, mode='r', buffering=-1,encoding=None, errors=None, newline=None, closefd=True, opener=None)
file:要打开的文件
mode:文件打开模式。默认访问模式是读(r)
buffering:缓冲区大小
encoding:文件编码类型
errors:编码错误处理方法
newline:控制通用换行符模式的行为
closefd:控制在关闭文件时是否彻底关闭文件
opener:通过传递可调用对象opener,可以使用自定义开启器
r | 只读方式。文件指针放在文件开头。这是默认模式 |
rb | 二进制只读。指针在文件开头 |
r+ | 读写。指针在文件开头 |
rb+ | 二进制读写。指针在文件开头 |
w | 只写。该文件已存在则覆盖。不存在则创建 |
wb | 二进制只写。该文件已存在则覆盖。不存在则创建 |
w+ | 读写。该文件已存在则覆盖。不存在则创建 |
wb+ | 二进制读写。该文件已存在则覆盖。不存在则创建 |
a | 追加内容。该文件已存在则指针在文件的结尾。不存在则创建 |
ab | 二进制追加。该文件已存在则指针在文件的结尾。不存在则创建 |
a+ | 读写。该文件已存在指针在文件的结尾。不存在则创建 |
ab+ | 二进制读写。该文件已存在则指针在文件的结尾。不存在则创建 |
file.closed:如果文件已被关闭返回True,否则返回False
file.mode:返回打开文件的访问模式
file.name:返回文件的名称
file.close() | 关闭文件 |
file.flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件 |
file.fileno() | 返回一个整形的文件描述符 |
file.isatty() | 如果文件连接到一个终端设备返回True,否则返回False |
file.next() | 返回文件下一行 |
file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有内容 |
file.readline([size]) | 读取整行,包括“\n”字符 |
file,readlines([sizeint]) | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为hint字节的行,实际读取值可能比sizeint大些 |
file.seek(offset[,whence]) | 设置文件当前位置 |
file.tell() | 返回文件当前位置 |
file.truncate([size]) | 截取文件,截取的字节通过size指定,默认为当前文件位置 |
file.write(str) | 将字符串写入文件,返回的是写入的字符长度 |
file.writelines(lines) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符 |
fo = open('重要学习文件.txt',"wb")
print("文件名:",fo.name)
print("是否已关闭:",fo.closed)
print("访问模式:",fo.mode)
fileObject.closed():方法close用于关闭一个已经打开的文件,关闭后的文件不能再进行读写操作,否则会触发ValueError错误。在程序中可以多次调用close()方法,当File对象被引用到操作另外一个文件时,Python会自动关闭之前的File对象。
内置函数next()遍历文件中的下一行。
如果到达结尾(EOF),则触发StopIteration异常
next(iterator[, default])
fo = open('456.txt','r')
print('文件名为:',fo.name)
for index in range(4):line = next(fo)print("第%d行-%s"%(index, line))
fo.close()
file.read([size]):从目标文件中读取指定的字节数,如果没有给定字节数或参数为负,则读取所有内容。
fo = open("销售数据.txt",'r+')
print('文件名为:', fo.name)
line = fo.read(8)
print("读取的数据:%s"%(line))
fo.close()
使用OS对象
os.access(path, mode):检验对当前文件的操作权限模式。
path:是否有访问权限的路径
mode:测试当前路径的模式,以下4种
os.F_OK:测试path是否存在
os.R_OK:测试path是否可读
os.W_OK:测试path是否可写
os.X_OK:测试path是否可执行
import os,sys
ret = os.access(r"123\456.txt",os.F_OK)
print("F_OK - 返回值%s"% ret)
ret = os.access(r"123\456.txt", os.R_OK)
print("R_OK - 返回值%s"% ret)
ret = os.access(r"123\456.txt", os.W_OK)
print("W_OK -返回值%s"%ret)
ret = os.access(r"123\456.txt",os.X_OK)
print("X_OK - 返回值%s"%ret)
os.chdir(path):修改当前工作目录到指定的路径。
path:表示要切换到的新路径
返回值:允许修改则返回True,否则返回False
import os,sys
path = '123'
retval = os.getcwd() # 获取当前文件的工作目录
print("学习资料的保存位置是:%s"%retval)
os.chdir(path)
retval = os.getcwd()
print("目录修改成功%s"%retval)
os.chmod(path, mode):修改文件或目录的操作权限
path:文件名路径或目录路径
mode:不同权限级别,文件权限以“用户id->组id->其他”的顺序进行检验
import os, stat
os.chmod("123\数据库下载地址.txt",stat.S_IXGRP) # 设置文件可以通过用户组执行
os.chmod("123\数据库下载地址.txt",stat.S_IWOTH) # 设置文件可以被其他用户写入
print("修改成功")
os.open(file, flags[, mode]):打开一个文件,返回新打开文件的描述符
os.write(fd, str):写入字符串到文件描述符fd指向的文件中,返回实际写入的字符串长度。
fd:文件描述符
str:写入的字符串
os.closed(fd):关闭指定文件的描述符fd,没有返回值。
fd:文件描述符
import os
fd = os.open("收视率.txt",os.O_RDWR|os.O_CREAT)
str = "XX好声音的收视率是:2.271"
ret = os.write(fd, bytes(str,"UTF-8"))
print("写入的位数为: ")
print(ret)
print("写入成功")
os.close(fd)
print("关闭文件成功")
os.read(fn, n):从文件描述符fd指向的文件中读取最多n个字节的内容,返回含读取字节的字符串。文件描述符fd对应的文件已达到结尾时,返回一个空字符串。
import os
fd = os.open("财务预算计划.txt",os.O_RDWR) # 以读写方式打开文件
# 读取文件中的8个字符
ret = os.read(fd, 8)
print(ret)
os.close(fd)
print("关闭文件成功")
os.mkdir(path [, mode]):以数字权限模式创建目录,默认的模式为0777(八进制)。
返回值:返回包含读取字节的字符串。
path:表示要创建的目录
mode:表示要为目录设置的权限数字模式
os.makedirs(path, mode=0o777):递归创建目录。创建包含子目录的文件夹目录。
import os
path = "迅雷电影/2022/科幻"
os.makedirs(path)
print("路径被创建")
其他文件操作模块
import fileinput
def demo_fileinput():with fileinput.input(['123.txt', '456.txt']) as lines:for line in lines:print('总第%d行,'%fileinput.lineno(),'文件%s中第%d行:'%(fileinput.filename(),fileinput.filelineno()))print(line.strip())
if __name__ == "__main__":demo_fileinput()
fileinput内置方法:
input(): 返回能够用于迭代一个或多个文件中所有行的对象。
filename():返回当前文件的名称
lineno():返回当前读取的行的数量
isfirstline():返回当前行是否是文件的第一行
filelineno():返回当前读取行在文件中的行数
import os
filenames = []
for a,b,files in os.walk('test'): # 获取当前目录‘test’中的所有文件if files:filenames.append([file[:-4] for file in files]) # 设置扩展名为3个字母
fname = 'Excel'
i = 0
for files in filenames:f = open(fname+str(i)+'.xls','w')for name in files:f.write(name[-4:]+'\t'+name[:4]+'\n')f.close()i += 1
有时需要提取多个文件的文件名,并且要求提取文件名的不同部分。此时可以使用for遍历整个目录中的内容,然后使用write()函数将文件名写入指定文件中。
通过方法os.walk()对test目录下的所有文件进行遍历,获取所有记事本的文件名字符串,并保存到列表filenames中,根据指定的电子表格文件名将文件名中的内容写入Excel文件。