前言:之前使用input接收用户输入,print输出处理结果,但希望代码可以自动分析系统的日志,并把系统的分析结果保存为一个新的日志,则需要引入文件,因为在编写代码时,系统为了更快响应,把数据存放在内存中(与CPU传输速度更快),而不是硬盘中,但也带来断电就会丢失的问题.
打开文件
open()函数
打开文件并返回文件对象
open(file,mode='r',buffering=-1,encoding=None,errors=None,newLine=None,closefd=True,opener=None)
第一个参数为传入的文件名,若文件名不带路径,则Python在当前文件夹(即根目录)中找到文件并打开
第二个参数指定文件的打开模式,默认模式为文本只读
'r':以只读方式打开文件,默认模式
'w':以写入方式打开文件,会覆盖已存在的文件
'x':若文件已存在,以此方式打开会产生异常
'a':以写入方式打开,若文件已存在,则在末尾追加写入
'b':以二进制模式打开文件
't':以文本模式打开文件(默认)
'+':可读写模式(可添加到其他模式中使用)
'U':通用换行符支持
open()成功打开文件时返回文件对象,对文件对象操作可读取或修改文件,如
f = open("record.txt")
文件对象方法
close():关闭文件
read(size=-1):从文件读取size个字符,当未给定size或给定负值,则读取剩余所有字符,然后作为字符串返回
readline():从文件指针处向后读取一整行字符串(即遇到换行符结束)
write(str):将字符串str写入文件
writelines():向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象
seek(offset,from):在文件中移动文件指针,从from(0代表起始位置,1为当前位置,2为文件末尾)偏移offset个字节
tell():返回当前在文件中的位置
文件的关闭
采用close()方法,但因为Python有垃圾收集机制,在文件无引用时自动关闭文件,忘记关闭文件并不会造成内存泄漏.但最好还是关闭文件,如对文件进行写入操作,则应在写入后关闭,因为Python会缓存写入的数据,若中途发生类似断电之类的事故,则缓存数据不会写入文件.
文件的读取和定位
读取方法包括文件对象的read()和readline()方法以及直接list或使用迭代读取
read()方法按字符为单位读取,不设置参数,读取所有字符,文件指针指向末尾,返回字符串
tell()用于定位,告诉当前文件指针位置
>>>f.read(3)
'天啊:' #一个中文字符两个字节,英文冒号1个字节
>>>f.tell()
5 #指针指向':'
seek()用于调整指针位置,将文件设置到起始位置,使用f.seek(0,0)即可
>>>f.seek(0,0)
0
readline():从文件指针处向后读取一整行字符串(即遇到换行符结束)
>>>f.readline()
'haha\n' #遇到\n结束
把文件内容放入列表中,因为列表也是可迭代对象
>>>list(f)
['天啊:']
迭代读取文本文件中的每一行
>>>f.seek(0,0)
0
>>>lines = list(f)
>>>for each_line in lines:
print(each_line)
以上示例多此一举,因为文件支持迭代,简化为
>>>f.seek(0,0) #回到文件起始位置
>>>for each_line in f:
print(each_line)
文件的写入
1)写入前确保之前的打开模式有'w'或'a',因为默认模式为只读,否则出错
2)关注'w'和'a'模式,前者是覆盖,后者是追加
>>>f.write("record.text","w")
>>>f.write("哈哈哈")
3
>>>f.close()
文件系统
模块:每一个源代码文件(.py文件)都是一个模块.
如random模块的randint()函数生成随机数,调用时要先导入random模块
对于文件系统的访问,Python通过OS模块实现,因为不同的操作系统底层对文件系统的访问工作原理不同导致使用不同的文件系统模块,而采用OS模块能帮助选择正确的模板并调用.
OS模块
OS模块中关于文件\目录的常用方法
getcwd()
返回应用程序当前工作目录
>>>import os
>>>os.getcwd()
'c:\\....' #...表示缩略
chdir(path)
改变当前工作目录
>>>os.chdir("E:\\")
>>>os.getcwd()
"E:\\"
listdir(path='.')
列举指定目录中的文件名(默认参数为'.','.'表示当前目录,'..'表示上一级目录)
>>>os.listdir()
['workspace']
>>>os.listdir("C:\\")
['Users',......]
mkdir(path)
用于创建文件夹,创建单层目录,若存在,则抛出FileExistError异常
>>>os.mkdir("test")
>>>os.listdir()
['test',......]
>>>os.mkdir("test") #error
makedirs(path)
递归创建多层目录,若该目录已存在,则抛出异常,'E:\\a\\b'与'E:\\a\\c'不会冲突
>>>os.makedirs(r".\a\b\c") #r表示原始字符串
remove(path),rmdir(path)和removedirs(path)
remove()用于删除指定文件而rmdir()是删除目录,若该目录为非空,则抛出异常,removedirs()则是递归删除多层目录,从子目录到父目录逐层测试删除,遇到目录非空则抛出异常.
>>>os.listdir()
['a''b''test.txt']
>>>#当前工作目录结构为a\b\c,b\,test.txt
>>>os.remove("test.txt")
>>>os.rmdir("b")
>>>os.removedirs(r"a\b\c")
>>>os.listdir()
[]
rename(old,new)
用于重命名文件或文件夹
>>>os.rename("a.txt","b.txt")
system(command)
用于使用操作系统提供的小工具
>>>os.system("calc") #使用计算器
walk(top)
遍历top参数指定路径下的所有子目录,并将结果返回一个三元组(路径,[包含目录],[包含文件])
>>>for i in os.walk("test"):
print(i)
('test',['a','b','c'],[])
('test\\a',[],['a.txt'])
('test\\b',['b1','b2'],['b.txt'])
('test\\b\\b1',[],['b1.txt'])
('test\\b\\b2',[],['b2.txt'])
('test\\c',['c1'],[])
('test\\c\\c1',['c11'],[])
('test\\c\\c1\\c11',[],['c11.txt'])
文件夹分布图如下,待补
路径操作中常用定义
os.curdir:指代当前目录('.')
os,pardir:指代上一级目录('..')
os.sep:输出操作系统特定的路径分隔符
os.linesep:当前平台使用的行终止符(Windows下为'\r\n',Linux为'\n')
os.name:指代当前操作系统(包括'posix''nt''mac''os2''ce''java')
os.path模块:完成针对路径名的操作
basename(path):去掉目录路径,单独返回文件名
dirname(path):去掉文件名,单独返回目录路径
>>>os.path.dirname(r"a\b\test.txt")
'a\\b'
>>>os.path.basename(r"a\b\test.txt")
'text.txt'
join(path1[,path2[,...]]):将path1(路径名)和path2(文件名)组合成完整的路径名
>>>os.path.join(r"C:\Python34\Test","FishC.txt")
'C:\\Python34\\Test\\FishC.txt'
split(path):分割文件名和路径,返回(f_path,f_name)元组.若完全使用目录,则会将最后一个目录作为文件名分离,且不会判断文件或目录是否存在
>>>os.path.split(r"a\b\test.txt")
('a\\b','test.txt')
splitext(path):分割文件名和扩展名,返回(f_name,f_extension)元组
>>>os.path.splitext(r"a\b\test.txt")
('a\\b\\test','.txt')
getsize(file):返回指定文件的尺寸,单位为字节
>>>os.chdir(r"C:\Python34")
>>>os.path.getsize("python.exe")
40960
getatime(file):返回文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
getctime(file):返回文件的创建时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
getmtime(file):返回文件的最新修改时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
>>>import time
>>>temp = time.localtime(os.path.getatime("python.exe"))
>>>print("python.exe被访问的时间是:",time.strftime("%d %b %Y %H:%M:%S",temp))
python.exe被访问的时间是:27 May 2015 21:16:59
以下为函数返回True或False
exists(path):判断指定路径(目录或文件)是否存在
isabs(path):判断指定路径是否为绝对路径
isdir(path):判断指定路径是否存在且是一个目录
isfile(path):判断指定路径是否存在且是一个文件
islink(path):判断指定路径是否存在且是一个符号链接
ismount(path):判断指定路径是否存在且是一个挂载点
samefile(path1,path2):判断path1和path2两个路径是否指向同一个文件
pickle模块
用于将复杂数据类型,如列表等,以二进制形式保存在文本文件中
从文件中读取字符串很容易,可采用read()方法或readline(),返回字符串,但若想从字符串中提取数值,则可以使用int()或float()函数将字符串强制转化为具体数值.
当保存的数据是列表,字典,类的实例等复杂数据类型时,普通的文本操作不适用,需要使用pickle模块,其可以将所有Python的对象转化为二进制的形式存放,称为pickling,从二进制转换回对象称为unpickling
>>>import pickle
my_list = [123,12.1.'good']
pickle_file = open('E:\\my_list.pkl','wb') #一定要以二进制形式打开
pickle.dump(my_list,pickle_file)
pickle_file.close()
上例将列表保存为文件,打开方式'wb',即二进制形式打开,后缀名随意,为便于记忆,采用pkl,使用dump方法保存数据
由于my_list.pkl是二进制文件,所以打开是乱码
unpickling过程
pickle_file = open('E:\\my_list.pkl','rb')
my_list = pickle.load(pickle_file)
print(my_list)
[123,12.1.'good'] #取回列表
总结:pickle模块不仅可保存列表,还可以保存任何想象到的对象.