大家好,欢迎来到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