——文件的其他操作——
我们之前提到的,文件读一遍之后,文件指针的位置就停留在了文件的末尾,这时候如果再进行读取文件,会发现读取不到任何的内容。那么怎么知道文件指针的位置呢?
①语法:f.tell()
tell()方法返回文件的当前位置,即文件指针当前位置。
文件在什么也没操作的时候,文件指针的位置是0。
我们对文件读取一行之后,文件的指针位置就发生了变化,按照字符进行计数。
在这里如果用f.read()进行读取,再对f.read()说明一下:
语法:f.read(size)
参数:size -- 从文件中读取的字节数
read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。
那么怎么解决之前所说的问题呢,怎样让指针重新回到指定位置呢?
②语法:f.seek(offset[, whence])
参数:offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
比如,我从文件的开头先开始读取一行,然后打印出此时文件指针的位置,然后我再让文件指针回到0的位置,再读取一行,打印此时文件指针的位置。按道理说,我让文件指针回到0的位置之后,我再打印一行应该是文件的第一行。我们来看一下结果是不是这样:
确实是这样。如果是回到任意位置,打印一行,我们看一下结果:
③语法:f.encoding (注意:后面没有括号)
f.encoding可以知道文件的编码方式,一般为“utf-8”。
④语法:f.fileno()
fileno() 方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
也就是说fileno()返回的是文件句柄的编号。
在这里再说明一下“文件句柄”:在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。
⑤语法:f.flush()
flush是刷新的意思,当我们以写的模式打开文件的时候,我们在写入一行时,如果此时突然断电,这一行就可能没有写进硬盘中,因为文件在读写的时候有一个缓存的机制,断电的时候可能内容还在内存的缓存中,并没有写到硬盘里。硬盘的读写速度是比内存慢的。内存是等待写几行,等到内存的缓存满了之后,再一起写到硬盘中,这个内存的缓存一般很小。
那么我们怎么保证我们写一行,这一行就能写到了硬盘中?
这时候就用到了强制刷新。
flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
我们来实践一下:
我们以“w”的方式打开一个名为“test.text”的文件,并且写进去“星期一”。
可以看到,名为“test”的text文件中没用任何内容。
用f.flush()强制刷新一下。
可以看到,星期一就被写进去了。
我们再接着写“星期二”。
一样的,“星期二”没有被写进去。
再用f.flush()刷新一下。
“星期二”就被写进去了。
⑥语法:f.truncate()
truncate() 方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除。
#指定参数size——截断文件为size个字符
#不指定参数size——从当前位置起,截断后面所有的字符。
#如果文件是“w”模式,则文件指针的位置在开始的地方,f.truncate()之后,则会清空所有的内容。
#如果文件是“a”模式,文件指针的位置在文件的末尾,f.truncate()之后,对于文件来说,没什么变化。
⑦语法:f.close()
close() 方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误。 close() 方法允许调用多次。当 file 对象被引用到操作另外一个文件时,Python 会自动关闭之前的 file 对象。使用 close() 方法关闭文件是一个好的习惯。
⑧语法:f.closed (注意:没有括号)
判断一个文件是否关闭。关闭的话返回True,没有关闭的话返回False。
⑨语法:f.name
f.name是打印文件的文件名。
(10)语法:f.errors
f.errors是打印文件的报错级别。
(11)语法:f.isatty()
isatty() 方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False。
(12)语法:f.mode
打印文件的模式。
(13)语法:f.readable()
判断文件是否可读。
(14)语法:f.seekable()
判断文件是否可以使文件指针偏移。
(15)语法:f.writable()
判断文件是否可写。
(16)语法:f.writelines()
writelines() 方法用于向文件中写入一序列的字符串。
这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
换行需要制定换行符 \n。