Python 文件操作

Python013

Python 文件操作,第1张

open(filename[,mode,encoding="编码"]) :第一个参数文件名如果不加路径,默认在该py文件目录下(路径举例: E:/XXX或E:\\xxx ),第二个是模式,默认为 'r' ——只读,举例: f = open('E:/abc.txt') ,如果要转编码并写入模式:

f = open('E:/abc.txt','w',encoding='utf-8')

1. 模式

2. 方法

(1) close() : 关闭文件,因为文件写入时是写在内存,只有关闭时才写入硬盘,所以写完记得关闭

(2) read(size = -1) :读取文件size个字符,不写默认是-1,此时读取所有内容(换行按\n来表示,很不好看),并作为字符串返回,一定要注意 读完以后文件指针将会指向末尾 ,所以下一次在用read方法时会发现读取不出内容了,所以这个就要用seek移动指针或者关闭文件重新定义

(3) tell() :返回当前文件指针指向的位置

(4) seek(offset,from) :移动文件指针,代表从from参数开始偏移offset个字节,0代表起始位置,1代表当前位置,2代表文件末尾

(5) readline() :按序列读取一行内容,默认\n为边界

(6) write() :写入内容,但必须要有写入权限才行,否则报错,写完会返回写入的长度,例如: len1 = f.write('abc') ,此时len1就为3

(7) truncate() :删除内容,把当前指针以后的内容全删了,举例:

注:

1.文件还可以转化为 list 之类的,例如: list1 = list(f) ,此时文件内容的按\n被隔开,然后可以用for语句读取文件所有内容,举例:

2.上面输出文件内容方法相对低效,所以一般都直接用for输出整个文件,举例:

通过 fileno 函数,我们可以查看一个文件对应的文件描述符,对应的是程序中打开的文件序号,举例:

可以看出python在启动时会先启动标准流的文件(文件描述符分别为:0/1/2),所以之后打开的文件就从3开始递增,当释放一个文件资源时,该描述符序号被释放,之后打开的文件可以继续使用该序号的文件描述符

python中的 print 的本质是通过 sys.stdout 来进行内容输出,而 sys.stdout 的本质是一个"文件",相当于我们所有的输入输出的本质都是在对 sys.stdin / sys.stdout / sys.stderr 这些文件来进行读写操作,举例:

open 函数不仅可以打开本地文件,也可以打开文件描述符,而该参数默认为 True ,代表 close 后会将对应的文件资源释放,而对于一些文件描述符,我们只是希望 close 时将打开文件描述符的对象释放,而不释放对应的文件资源,那么则可以设置 closefd=False ,举例:

需要使用到 chardet 模块,按二进制可读打开文件,然后通过 detect() 方法查看,举例:

所以就可以根据文件来设置编码了:

有时候使用文件的编码解码也可能会出现无法解析的情况,例如两种编码混在同一个文件里的时候,此时可以设置 errors 参数为 ignore 来避免该问题,示例:

可用 os 模块下的 chmod() 函数,具体参考: http://www.runoob.com/python/os-chmod.html

使用 os 模块下的 remove() 函数可以实现删除文件,举例:

可以使用自带的 zipfile 模块来进行操作,举例:

可以使用自带的 tarfile 模块来进行操作,举例:

https://www.cnblogs.com/lotusto/p/5805543.html

file.tell 只是返回当前文件操作指针的位置,如果想判断 file.tell 返回的位置是末尾

os.path.getsize('文件的路径') == file.tell()

pos = file.seek(0,2) 即获得文件末尾位置

工作中经常会遇到处理日志文件的问题:为了得到日志的最新状态,我们需要获取日志文件的最后部分行来做判断。那么,这种情况下我们应该怎么做呢?

1)常规方法:从前往后依次读取

步骤:open打开日志文件。

读取文件,获取文件的总行数。

遍历所有行,提取指定行的数据。

优点:简单,方便

缺点:当文件大了以后时间太慢,无法忍受

2)推荐方法:

步骤:open打开日志文件。

移动文件读取指针到文件末尾。

从后往前移动指针直到合适的位置。

读取文件,提取指定行的数据。

优点:时间相对固定,适合处理大文件

示例:

[python] view plain copy

logFile = open('logFilePath.log', 'r')

logFile.seek(0,2)

logFile.seek(-1000000,2)

rowCount = 0

for row in logFile.readlines()[1:]:

pass

seek():移动文件读取指针到指定位置

tell():返回文件读取指针的位置

seek()的三种模式:

(1)f.seek(p,0) 移动当文件第p个字节处,绝对位置

(2)f.seek(p,1) 移动到相对于当前位置之后的p个字节

(3)f.seek(p,2) 移动到相对文章尾之后的p个字节