Python|细说函数open()及其返回的文件对象的read、write等方法

Python|细说函数open()及其返回的文件对象的read、write等方法目录1内置函数open属性3文件对象“读”的方法4文件对象“写”的方法5fo。如‘text.txt’注意路径的规范写法,以下三种写法都是

大家好,欢迎来到IT知识分享网。

Python标准库内置函数open() 返回一个文件对象(假设赋值给变量fo),返回的文件对象有fo.read()、fo.write()、fo.close()、fo.tell()、fo.seek()、fo.flush()等方法可供使用。

目录

1 内置函数open()

2 文件对象(fo)属性

3 文件对象“读”的方法

4 文件对象“写”的方法

5 fo.tell()、fo.seek()、fo.flush方法

6 fo.close()方法

7 与文件读写相关的内置模块pickle

1 内置函数open()

内置函数open()的基本格式如下:

open(file, mode=’rb’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

以上参数除了file是必须参数以外,其它参数都是可选参数。

(具体参考:https://docs.python.org/3/library/functions.html#open)

1.1 file参数

file必须是一个字符串或表示一个字符串的字符串变量,用这个字符串来表示需要打开的文件的路径。

file可以是绝对路径,如’E:\\test.txt’

也可以是相对路径(相对于当前工作路径),如‘text.txt’

注意路径的规范写法,以下三种写法都是允许的:

‘D:/original.txt’

‘D:\\original.txt’

r’D:\original.txt’

1.2 mode参数

mode是用来指定文件打开后的操作方式,如’r’是用来read(写),’w‘是指用来write(写,文件打开后第一次使用write()j 用覆盖文件已有内容的方式来写,再次使用write()如果没有改变文件指针的位置则是以追加的方式写入。),’a’也是用来write(写,以追加内容的方式),’+’是指用来update(更新,读和写,可以添加到其它模式中去)。

文件可以以text mode(文本方式)的方式,也可以以binary mode(二进制方式)的方式来读写,分别用’b’和’t’来指定。(read()方法在指定整数自变量的情况下会读取指定的字符数或字节数(视打开模式是文本模式还是二进制模式而定))

mode的默认方式是‘rb’,也就是打开后以字符串的方式进行读操作。

当文件不存在时,’w’模式会新建文件,’r’模式会出错。

1.3 buffering参数

用于指定buffering(缓存,由磁盘复制到内存的缓冲区)策略。如果该缓冲值被设置为0,则表示不使用缓冲。如果该缓冲值是1,则在访问一个文件进行时使用缓冲。如果指定缓冲值大于1的整数,缓冲使用所指示的缓冲器大小进行。如果是负数,缓冲区大小是系统默认的(默认行为)。

1.4 encoding参数

仅在text mode(文本模式)下指定,指定文本模式时默认采用locale.getpreferredencoding()的返回值作为文件编码,以windows7简体中文版来说是返回CP936或gdk。如有某个.txt文件是以UTF-8编码并且有中文时,open()的参数必须指定编码方式为utf-8,如:open(‘test.txt’, ‘rt’, ‘ encoding=”UTF-8″)

UTF-8的编码方式是每个汉字使用三个字节,如1000个汉字就需要3KB的存储空间。

1.5 errors参数

用于指定文本模式下编码和解码错误时的处理方式;

1.6 newline参数

用于指定文本分行(段),可以用 os.linesep来查询,如widnwos7下就是’\r\n’

1.7 with open() as fileObject

用关键字 with 处理文件对象是个好习惯。它的先进之处在于文件用完后会自动关闭,就算发生异常也没关系。它是 try-finally 块的简写:

>>> with open(‘/tmp/workfile’, ‘r’) as f:

… read_data = f.read()

>>> f.closed# 如果文件被关闭返回true,否则为false;

True

2 文件对象(fo)属性

一旦文件被打开,则就会有一个文件对象,你就可以得到有关该文件的各种信息。

fo.closed:如果文件被关闭返回true,否则为false;

fo.mode:返回文件打开访问模式;

fo.name:返回文件名;

3 文件对象“读”的方法

3.1 fo.read([size])

read(int size)方法在指定整数自变量的情况下会读取指定的字符数或字节数(视打开模式是文本模式还是二进制模式而定)并返回一个指定数量的字符串。

read()如果没有指定参数,则返回整个文档内容做为一个字符串。当文件大小为当前机器内存两倍时,就会产生问题。

没有参数的read()会一直读文件到文件末尾(文件指针移到最后,指向为空),再操作fo.read()时会返回一个空字符串(””):

3.2 fo.readlines()

该方法也是读取整个文档的内容,返回一个列表。该列表相当于是以换行’\n’符号来分割整个文档,列表的第n个元素就是文档第n+1行的内容;

3.3 fo.readline

该方法每次读取一行的内容,并返回该内容的一个字符串,同时文件指针指向下一行的开头位置,再次运行fo.readline后,则从最新的指针位置开始读取一行的内容返回,直到文档的第后一行,fo.readline在读不到下一行时会返回一个空字符串。

所以此方法通常通过一过while循环来读取整个文档内容。如:

with open(‘original.txt’, ‘rU’,encoding=”UTF-8″) as fo:

….str = fo.readline()

….while str:# 使用字符串str是否为空为判断是否有读到最后一行

……..……

……..str = fo.readline()

3.4 直接迭代

如果open()返回的文件对象都实现了__iter__()方法,可以返回一个迭代器,则在open()后可以直接用for方法迭代,如:

fo = open(‘original.txt’, ‘rU’,encoding=”UTF-8″)

for item in fo:

….print(item)

fo.close()

3.5 关于换行

对于文本模式来说,默认读到\n、\r、\r\n时,都可以被判定为一行,而readline()或readlines()读到的第一行的换行字符都一律转换为\n;

对于二进制模式来说,行的判断标准默认是遇到b’\n’这个bytes类型。

文本模式在写入的情况下,任何’\n’都会被置换为os.linesep的值。(windows就是’\r\n’)

4 文件对象“写”的方法

4.1 fo.write()方法

写文件需要open()以 ‘w’、’r+’、 ‘a’为参数,才可以使用fo.write()方法在文件中写入内容,写入的内容必须是字符串,如果是数字需要用str()函数将其做一个转换。

该方法的返回值是一个整数,表示写入的字符串的长度。

‘w’,当文本不存在时可以新建(当然不能读),如果文件存在,则先清空文件中的全部内容,‘w+‘虽然也可以读,但也只能读到空白,用+添加附加模式没什么意义。

‘r+’是读写的形式,可以读,文件不存在时出错,写也是以覆盖的方式,先清空文件中的全部内容;

‘a’是追求读的方式,也就是使用fo.write()方法写入内容到文件时,以前的内容不清空,会在文档的末尾处接着写。

4.2 fo.writelines(sequence)方法

写入字符串序列到文件。如果需要换行,需要加入每行的换行符\n。

fo = open(“foo.txt”, “r+”)

fo.seek(0, 2)# 该语句用于定位文件指针位置,参数0表示位偏移为0,参数2 表示自文件末尾开始

seq = [“\nThis is 8th line\n”, “This is 9th line”]

line = fo.writelines( seq )

fo.close() # 文件对象使用close()方法,表示文件对象操作完毕,内存缓存区的内容写入文件,并清空。

5 fo.tell()、fo.seek()、fo.flush方法

无论读写文件,Python都会跟踪文件中的读\写位置。在默认情况下,文件的读\写位置都位于文件的开始位置。Python提供了控制文件读\写位置的方法,可以改变文件读\写操作发生的位置进行随机读写。

当使用open()函数打开文件时,open()函数在内存中创建缓冲区,将磁盘上的文件内容复制到缓冲区。文件内容复制到文件对象缓冲区后,文件对象将缓冲区视为一个大的列表,其中的每一个元素都有自己的索引,文件对象按字节对缓冲区索引计算。同时,文件对象对文件当前位置,即当前读\写操作发生的位置进行维护。许多方法隐式使用当前位置。比如调用readline()方法后,文件当前位置移动到下一个回车处。

fo.tell() 可以跟踪文件的当前位置,返回一个整数,代表文件对象在文件中的指针位置,该数值计量了自文件开头到指针处的比特数。单位是字节B。

需要改变文件对象指针的话,使用 fo.seek(offset,from_what)。指针在该操作中从指定的引用位置from_what移动 offset 比特,引用位置由 from_what 参数指定。 from_what 值为 0 表示自文件起始处开始,1 表示自当前文件指针位置开始,2 表示自文件末尾开始。from_what 可以忽略,其默认值为零,此时从文件头开始。

可以使用seek()实现文件的随机存取,文件的打开方式需要使用’r+’参数。

fo.flush方法在文件关闭前提前刷新内存缓冲区。

with open(‘c:\\test.txt’, ‘w’) as f:

….f.write(“12345”)

….print(f.tell())

….f.write(“6789”)

with open(‘c:\\test.txt’, ‘r+’) as f:

….f.seek(3)

….f.write(‘def’)

….f.flush

….print(f.tell())

….print(f.read())

….f.seek(0)

….print(f.read())

”’output:

5

6

789

123def789

text.txt内容为:123def789

”’

read()或write()操作后都会使文件指针的位移量发生改变。

read()会在文件指针指向的文件开始的位置开始读,如果没有指定size参数,全部读完后指针也指向到了最后一个字符的空字……

wrtie()会在文件指针最后确定的位移量处写入内容,如果是在中间则会覆盖后面需要的字节数,末尾则是添加。

6 fo.close()方法

文件对象的close()方法用于取消程序和文件之间连接,内存缓冲区的所有内容将写入磁盘。有时忘记使用该方法时会有一些意想不到的错误。

with语句可以打开文件并赋值给文件对象,之后就可以对文件进行操作。文件会在语句结束后自动判读,即使由于异常引起的结束也是如此。

7 与文件读写相关的内置模块pickle

我们可以很容易的读写文件中的字符串。数值就要多费点儿周折,因为 read() 方法只会返回字符串,应该将其传入 int() 这样的方法中,就可以将 ‘123’ 这样的字符转为对应的数值 123。不过,当你需要保存更为复杂的数据类型,例如列表、字典,类的实例,事情就会变得更复杂了。

好在用户不必要非得自己编写和调试保存复杂数据类型的代码。 Python 提供了一个名为 pickle 的标准模块。这是一个令人赞叹的模块,几乎可以把任何 Python 对象(甚至是一些 Python 代码段!)表达为为字符串,这一过程称之为封装 ( pickling )。从字符串表达出重新构造对象称之为拆封( unpickling )。封装状态中的对象可以存储在文件或对象中,也可以通过网络在远程的机器之间传输。

如果你有一个对象 x,一个以写模式打开的文件对象 f,封装对象的最简单的方法只需要一行代码:

pickle.dump(x, f)

如果 f 是一个以读模式打开的文件对象,就可以重装拆封这个对象:

x = pickle.load(f)

-End-

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/80837.html

(0)
上一篇 2024-08-30 20:00
下一篇 2024-08-31 15:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信