12.8Pythonwrite()和writelines():向⽂件中写⼊数据
前⾯章节中学习了如何使⽤ read()、readline() 和 readlines() 这 3 个函数读取⽂件,如果我们想把⼀些数据保存到⽂件中,⼜该如何实现呢?
Python中的⽂件对象提供了 write() 函数,可以向⽂件中写⼊指定内容。该函数的语法格式如下:
file.write(string)
其中,file 表⽰已经打开的⽂件对象;string 表⽰要写⼊⽂件的字符串(或字节串,仅适⽤写⼊⼆进制⽂件中)。
注意,在使⽤ write() 向⽂件中写⼊数据,需保证使⽤ open() 函数是以 r+、w、w+、a 或 a+ 的模式打开⽂件,否则执⾏ write() 函数会抛出 io.UnsupportedOperation 错误。
例如,创建⼀个 a.txt ⽂件,该⽂件内容如下:
C语⾔中⽂⽹
ww.baidu
然后,在和 a.txt ⽂件同级⽬录下,创建⼀个 Python ⽂件,编写如下代码:
f =open("a.txt",'w')
f.write("写⼊⼀⾏新数据")
f.close()
前⾯已经讲过,如果打开⽂件模式中包含 w(写⼊),那么向⽂件中写⼊内容时,会先清空原⽂件中的内容,然后再写⼊新的内容。因此运⾏上⾯程序,再次打开 a.txt ⽂件,只会看到新写⼊的内容:
写⼊⼀⾏新数据python怎么读取文件中的数据
⽽如果打开⽂件模式中包含 a(追加),则不会清空原有内容,⽽是将新写⼊的内容会添加到原内容后边。例如,还原 a.txt ⽂件中的内容,并修改上⾯代码为:
f =open("a.txt",'a')
f.write("\n写⼊⼀⾏新数据")
f.close()
再次打开 a.txt,可以看到如下内容:
C语⾔中⽂⽹
ww.baidu
写⼊⼀⾏新数据
因此,采⽤不同的⽂件打开模式,会直接影响 write() 函数向⽂件中写⼊数据的效果。
另外,在写⼊⽂件完成后,⼀定要调⽤ close() 函数将打开的⽂件关闭,否则写⼊的内容不会保存到⽂件中。例如,将上⾯程序中最后⼀⾏f.close() 删掉,再次运⾏此程序并打开 a.txt,你会发现该⽂件是空的。这是因为,当我们在写⼊⽂件内容时,操作系统不会⽴刻把数据写⼊磁盘,⽽是先缓存起来,只有调⽤ close() 函数时,操作系统才会保证把没有写⼊的数据全部写⼊磁盘⽂件中。
除此之外,如果向⽂件写⼊数据后,不想马上关闭⽂件,也可以调⽤⽂件对象提供的 flush() 函数,它可以实现将缓冲区的数据写⼊⽂件中。例如:
f =open("a.txt",'w')
f.write("写⼊⼀⾏新数据")
f.flush()
打开 a.txt ⽂件,可以看到写⼊的新内容:
写⼊⼀⾏新数据
有读者可能会想到,通过设置 open() 函数的 buffering 参数可以关闭缓冲区,这样数据不就可以直接写⼊⽂件中了?对于以⼆进制格式打开的⽂件,可以不使⽤缓冲区,写⼊的数据会直接进⼊磁盘⽂件;但对于以⽂本格式打开的⽂件,必须使⽤缓冲区,否则 Python 解释器会ValueError 错误。例如:
f =open("a.txt",'w',bufferin
g =0)
f.write("写⼊⼀⾏新数据")
运⾏结果为:
Traceback (most recent call last):
File "C:\Users\shaobing\Desktop\demo.py", line 1, in <module>
f = open("a.txt", 'w',bufferin
g = 0)
ValueError: can't have unbuffered text I/O
Python writelines()函数
Python 的⽂件对象中,不仅提供了 write() 函数,还提供了 writelines() 函数,可以实现将字符串列表写⼊⽂件中。
注意,写⼊函数只有 write() 和 writelines() 函数,⽽没有名为 writeline 的函数。
例如,还是以 a.txt ⽂件为例,通过使⽤ writelines() 函数,可以轻松实现将 a.txt ⽂件中的数据复制到其它⽂件中,实现代码如下:
f =open('a.txt','r')
n =open('b.txt','w+')
n.adlines())
n.close()
f.close()
执⾏此代码,在 a.txt ⽂件同级⽬录下会⽣成⼀个 b.txt ⽂件,且该⽂件中包含的数据和 a.txt 完全⼀样。
需要注意的是,使⽤ writelines() 函数向⽂件中写⼊多⾏数据时,不会⾃动给各⾏添加换⾏符。上⾯例⼦中,之所以 b.txt ⽂件中会逐⾏显⽰数据,是因为 readlines() 函数在读取各⾏数据时,读⼊了⾏尾的换⾏符。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。