Python学习之——文件的操作
(1)阅读文件内容——open方法内的打开方式为‘r’
open方法第一个参数是需要打开的文件的路径,第二个参数是打开方式,有“r”,“w”两种打开方式。“r”代表从文件读内容,“w”代表写入内容到文件中。默认打开方式是“r”。open方法返回一个文件对象,文件对象具有一些属性和内置方法。
- 文件对象的属性name(文件名),mode(打开模式)
example1 = "Example1.txt"
file1 = open(example1, "r")
file1.name
file1.mode
output:
‘Example1.txt’
‘r’
- 文件对象的read方法,可以将读出的内容赋值给一个str类型的变量
read方法可以指定需要阅读的字数。如果连续调用两次read方法,那么第二次读的起始位置就是第一次读的结束位置的下一个字符。
with open(example1, "r") as file1:
print(file1.read(4))
print(file1.read(4))
print(file1.read(7))
print(file1.read(15))
output:
注:每次对文件操作完毕后,需要关闭,既释放了资源,同时保证了不同python版本的一致性:
file1.close()
- with语句:一种更好地打开文件的方式。使用with语句,不需要自己调用close()方法,当with语句内部的代码执行完成后,会自动关闭文件。
with open(example1, "r") as file1:
FileContent = file1.read()
print(FileContent)
output:
This is line 1
This is line 2
This is line 3
- readline()方法
readline方法,每次读出指定文件的一整行
with open(example1, "r") as file1:
print("first line: " + file1.readline())
output:
first line: This is line 1
同样,readline()方法也可以指定要读出的字数,但是与read方法不同的是,readline的参数如果超过了某一行的字数,那么readline方法也只会返回那一行的内容,可能会造成部分缺失。read方法指定字数后,不会缺失。
with open(example1, "r") as file1:
print(file1.readline(20)) # does not read past the end of line
print("*******")
print(file1.read(20)) # Returns the next 20 chars
output:
- 通过for循环来遍历文件中的每一行
with open(example1,"r") as file1:
i = 0;
for line in file1:
print("Iteration", str(i), ": ", line)
i = i + 1
output:
Iteration 0 : This is line 1
Iteration 1 : This is line 2
Iteration 2 : This is line 3
- readlines()方法
readlines方法将文件中的内容,按行存储在list列表中。
with open(example1, "r") as file1:
FileasList = file1.readlines()
print(FileasList[0])
print(FileasList)
output:
This is line 1
[‘This is line 1 \n’, ‘This is line 2\n’, ‘This is line 3’] 按行存储列表元素
(2)向文件写入内容——open方法内的打开方式为‘w’(会覆盖文件中原来的所有内容)
- 打开方式为“w”,之后可以调用生成的文件对象的write()方法,向文件中写入内容。
exmp2 = '/resources/data/Example2.txt'
with open(exmp2, 'w') as writefile: # writefile为生成的文件对象
writefile.write("This is line A")
然后,调用文件对象的read()方法,来检验一下是否文件写入正确。
with open(exmp2, 'r') as testwritefile:
print(testwritefile.read())
output:
This is line A
- 当向文件中写入多行时,write()方法类似于readline()方法,即第二次写入的开始位置,是第一次写入的结束位置的下一个字符位置。
with open(exmp2, 'w') as writefile:
writefile.write("This is line A\n")
writefile.write("This is line B\n")
来检查一下,是否真的将内容写入到了文件中:
with open(exmp2, 'r') as testwritefile:
print(testwritefile.read())
output:
This is line A
This is line B
- 向文件中写入一个list中的内容
调用for循环
Lines = ["This is line A\n", "This is line B\n", "This is line C\n"]
with open('Example2.txt', 'w') as writefile:
for line in Lines:
print(line)
writefile.write(line)
检查一下是否真的写入到了文件中
with open('Example2.txt', 'r') as testwritefile:
print(testwritefile.read())
output:
This is line A
This is line B
This is line C
注意!!!!!!!!
将open方法的打开mode设置为“w”,将会重写所有文件中的内容
with open('Example2.txt', 'r') as testwritefile:
print(testwritefile.read())
print("&*&*&*&*&*&*")
with open('Example2.txt', 'w') as writefile:
writefile.write("Overwrite\n")
with open('Example2.txt', 'r') as testwritefile:
print(testwritefile.read())
output:
This is line A
This is line B
This is line C
&&&&&&
Overwrite
可见,当打开mode为“r”时,确实会重写文件中的所有内容。
(3)向文件写入内容——open方法内的打开方式为‘a’,append(不会覆盖文件中原来的所有内容)
open方法的打开方式为“a”的时候,不会将原来的内容覆盖,而是会在原来的基础上,继续添加新的内容。
(注:Example2.txt在这次添加进新的内容前的内容为“Overwrite”)
with open('Example2.txt', 'a') as testwritefile:
testwritefile.write("This is line C\n")
testwritefile.write("This is line D\n")
testwritefile.write("This is line E\n")
with open('Example2.txt', 'r') as testwritefile:
print(testwritefile.read())
output:
Overwrite
This is line C
This is line D
This is line E
(4)open()方法额外的模式:“r+”,“a+”, “w+”
先调用一次with语句并使用“a”,“w”模式向文件中写入内容,再调用with语句并使用“r”模式来阅读写入文件中的内容虽然可行,但是效率比较低。所以下面的三种额外的模式可以解决这个问题:
- “r+”:读和写,不能截断文件
- “w+”:写并读,截断文件
- “a+”:添加文件内容他并读。如果不存在open路径下的文件,则新建一个文件。
1. “a+”模式:
with open('Example2.txt', 'a+') as testwritefile:
testwritefile.write("This is line E\n")
print(testwritefile.read())
虽然这段代码没有任何问题,但是却读不出内容,因为此时文件的位置处在添加的内容的最后一个字符,所以读不出任何内容。
有时候,我们需要知道文件“光标”现在所处的位置,所以下面两个方法:
1).tell(): 以字节为单位返回当前的位置。
2).seek(offset,from):从参数“from”位置开始,移动“offset”个字节。参数“from”可以选择:0,1,2。0代表from文件的开始位置偏移,1代表from当前位置开始偏移,2代表from结尾开始偏移。 from参数可以省略,默认值为0,即从开头开始算起。
重新改写上面的“a+”模式读取内容的代码:
with open('Example2.txt', 'a+') as testwritefile:
print("Initial Location: {}".format(testwritefile.tell()))
data = testwritefile.read()
if (not data): # 空字符串在python中返回false
print('Read nothing')
else:
print(testwritefile.read())
testwritefile.seek(0,0) # move 0 bytes from beginning.
print("\nNew Location : {}".format(testwritefile.tell()))
data = testwritefile.read()
if (not data):
print('Read nothing')
else:
print(data)
print("Location after read: {}".format(testwritefile.tell()) )
output:
Initial Location: 48
Read nothing
New Location : 0
This is line A
This is line B
This is line C
Location after read: 48
2. "w+"和“r+”模式的区别
通过这两种模式打开的文件对象都可以调用其读read和写write的方法。但是向使用“w+”模式打开的文件对象内写入内容时,原来的内容会被覆盖并删除。
如果想在原有内容的基础上添加新的文件,需要使用**“r+”或“a+”**模式
- “r+”模式
“r+”可以结合定位函数seek()来在原有文件内容的基础上添加内容
with open('Example2.txt', 'r+') as testwritefile:
data = testwritefile.readlines()
print(data)
print("*********************")
testwritefile.write("Line x" + "\n")
testwritefile.write("Line y" + "\n")
testwritefile.write("Line z" + "\n")
#Uncomment the line below
#testwritefile.truncate()
testwritefile.seek(0,0)
print(testwritefile.read())
output:
星号行之前是原文件内容,星号行下面是添加新的文件内容以后的全部内容。
以“r+”模式打开的文件,通过调用truncate()方法,当从文件的起始位置写入时,可以使新写入的文件内容覆盖原文件的所有内容(因为如果不调用truncate()函数,那么新写入的字节数要小于原来文件的字节数,则原来文件剩余的字节数也同样会显示。但是调用truncate()方法之后,就算有剩余字节也会被删除)。
- 不调用truncate方法
with open('Example2.txt', 'r+') as testwritefile:
data = testwritefile.readlines()
print(data)
testwritefile.seek(0, 0)
print("*********************")
testwritefile.write("ha" + "\n")
testwritefile.write("en" + "\n")
testwritefile.write("xi" + "\n")
# testwritefile.truncate()
testwritefile.seek(0,0)
print(testwritefile.read())
output:
写入的文件内容中的“\n”也是占用两个字节,所以原文件剩余的内容也依然被显示出来了。
- 调用truncate方法
with open('Example2.txt', 'r+') as testwritefile:
data = testwritefile.readlines()
print(data)
testwritefile.seek(0, 0)
print("*********************")
testwritefile.write("ha" + "\n")
testwritefile.write("en" + "\n")
testwritefile.write("xi" + "\n")
testwritefile.truncate()
testwritefile.seek(0,0)
print(testwritefile.read())
output:
可见,哪怕原来的文件中还有剩余的字节,调用了truncate方法之后,也不会显示他们。