Python学习之——文件的操作

(1)阅读文件内容——open方法内的打开方式为‘r’

open方法第一个参数是需要打开的文件的路径,第二个参数是打开方式,有“r”,“w”两种打开方式。“r”代表从文件读内容,“w”代表写入内容到文件中。默认打开方式是“r”。open方法返回一个文件对象,文件对象具有一些属性和内置方法。

python获取文件属性 python 读取文件属性_python

  • 文件对象的属性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获取文件属性 python 读取文件属性_打开方式_02

注:每次对文件操作完毕后,需要关闭,既释放了资源,同时保证了不同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:

python获取文件属性 python 读取文件属性_文件写入_03

  • 通过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+”**模式

  1. “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:

python获取文件属性 python 读取文件属性_python获取文件属性_04

星号行之前是原文件内容,星号行下面是添加新的文件内容以后的全部内容。

以“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:

python获取文件属性 python 读取文件属性_打开方式_05

写入的文件内容中的“\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:

python获取文件属性 python 读取文件属性_文件写入_06


可见,哪怕原来的文件中还有剩余的字节,调用了truncate方法之后,也不会显示他们。