文件的基本操作
在Python中,文件操作是非常普遍的操作。文件操作通常包括读取文件和写入文件两个方面。
1、读取文件
在Python中,使用内置的open()函数可以打开一个文件,并返回一个文件对象。有了这个文件对象,就可以使用read()方法读取文件的内容。比如我们在Pyhint编辑器的“Pyhint\condition”文件夹下面创建一个test.txt文件,然后打开Pyhint编辑器,在代码框中输入以下内容:
动手练一练:
# 打开一个文件
file = open("test.txt", "r") # “r”模式表示读取模式为只读模式
# 读取文件内容
content = file.read()
# 打印文件内容
print(content)
执行以上代码,输出结果为:
Learn python in www.pyhint.com
上面的例子中,open()函数用于打开“Pyhint\condition”目录下的test.txt文件,并且以只读模式“r”打开。然后,使用返回的文件对象的read()方法来读取整个文件的内容,并将其存储在变量content中。read()方法可以传入参数,用于指定读取字符的个数。例如:
动手练一练:
# 打开一个文件
file = open("test.txt", "r") # “r”模式表示读取模式为只读模式
# 读取文件内容
content = file.read(12) # 只读取12个字符,包括空格
# 打印文件内容
print(content)
执行以上代码,输出结果为:
Learn python
2、写文件
在Python中,我们使用write()函数可以将数据以文本形式写入文件。在使用write()函数之前,我们必须先使用open()函数来打开文件,如果使用“r”只读模式打开文件,那么就不能在文件上执行“写”的操作,所以如果要“写”文件,则必须使用带“w”模式的方式打开文件。如果文件不存在,将会创建一个新文件;如果文件存在,将会覆盖原有内容。例如:
动手练一练:
# 打开一个文件
file = open("test.txt", "w") # “w”模式表示读取模式为写入模式
# 写入文件的内容
content = "你好"
# write()函数会返回写入字符的个数
print("写入字符的个数为:", file.write(content))
执行以上代码,输出结果为:
写入字符的个数为: 2
上面的例子中,write()函数返回数字“2”,这说明write()成功把两个字符串写入“test.txt”文件,并返回写入的字符个数“2”。
但是需要注意的是,不论我们运行多少次上述的代码,test.txt文件里都只有2个字符“你好”。因为我们使用了“w”模式打开文件,并进行写文件的操作,每次都会删除文件的所有数据,然后进行新的写入。如果我们想在文件末尾进行写入,而不是从头开始覆盖写入,则可以传递“a”模式作为参数。例如:
动手练一练:
# 打开一个文件
file = open("test.txt", "a") # “a”模式表示读取模式为追加写入模式
# 写入文件的内容
content = "你好"
# 返回写入字符的个数
print("写入字符的个数为:", file.write(content))
执行以上代码,输出结果为:
写入字符的个数为: 2
上面的例子中,我们运行3次上述的代码,test.txt文件里将出现“你好你好你好”,说明每次运行上述代码,test.txt文件里面都会增加“你好”两个字符。
3、按行读文件
在大型程序开发中,我们经常会处理大量的数据,这些数据可能会超过计算机的内存限制,如果我们直接读取整个文件的内容到一个变量中,程序可能会因为内存不足而导致崩溃,因此我们需要一种方法来读取大型数据文件,Python提供了readline()函数可以逐行读取文件内容。例如:
动手练一练:
# 打开一个文件
file = open('test.txt', 'r') # “r”模式表示读取模式为只读模式
print(file.readline()) # 读取第一行
print(file.readline()) # 读取第二行
执行以上代码,输出结果为:
春眠不觉晓,
处处闻啼鸟。
上面的例子中,成功打印出test.txt文件中第一行和第二行的内容。
有时候我们需要读取文件中的特定行数,这时可以使用readlines()函数返回一个包含所有行的列表,然后从中获取指定行数。readlines()函数可以将文件的所有行读取到一个列表中,并返回该列表。例如:
动手练一练:
# 打开一个文件
file = open('test.txt', 'r') # “r”模式表示读取模式为只读模式
print(file.readlines()) # 读取所有行,并返回一个该列表
执行以上代码,输出结果为:
['春眠不觉晓,\n', '处处闻啼鸟。\n', '夜来风雨声,\n', '花落知多少。']
上面的例子中,我们使用readlines()函数读取test.txt文件中的所有行,并返回一个列表,列表中每个字符串表示文件中的一行,有多少行就会有多少个字符串,并且每个字符串后面还有“\n”换行符号,接着可以使用for循环来遍历这个列表来处理其中的数据。例如:
动手练一练:
# 打开一个文件
file = open('test.txt', 'r') # “r”模式表示读取模式为只读模式
for i in file.readlines(): # for循环遍历列表中的数据
print(i)
执行以上代码,输出结果为:
春眠不觉晓,
处处闻啼鸟。
夜来风雨声,
花落知多少。
上面的例子中,除了使用readline()函数和readlines()函数外,还可以直接循环遍历文件对象本身来执行读取操作,例如:
动手练一练:
# 打开一个文件
file = open('test.txt', 'r') # “r”模式表示读取模式为只读模式
for i in file: # 直接循环遍历file文件对象
print(i)
执行以上代码,输出结果为:
春眠不觉晓,
处处闻啼鸟。
夜来风雨声,
花落知多少。
上面的例子中,输出的结果和使用readlines()函数输出的结果一模一样。由于file文件对象是可迭代的对象,因此我们可以直接使用for循环来遍历文件的所有行,并将每一行的内容打印出来。需要注意的是,使用for循环逐行读取文件时,我们就不再需要使用readlines()函数来读取文件的每一行内容,因为for循环会自动遍历文件的所有行。
4、按行写文件
前面已经介绍了,write()函数是Python内置的函数,可以用来向文件中写入数据,但是,write()函数每一次只能向文件中写入单个字符串。Python提供了writelines()函数,用于向文件中写入多个字符串,每个字符串代表一行,需要自行添加“\n”换行符,例如:
动手练一练:
# 打开一个文件
file = open('test.txt', 'w') # “w”模式表示读取模式为写入模式
list = ['春眠不觉晓,\n', '处处闻啼鸟。\n', '夜来风雨声,\n', '花落知多少。']
file.writelines(list)
上面的例子中,运行代码之后会一次性将4行数据写入到test.txt文件中,这里需要注意的是,我们在列表“list”中一定要自行添加“\n”换行符,不然,写入数据后不会自动换行。
5、关闭文件
在Python中,使用open()函数打开文件后,一般情况下,文件对象会在程序退出后都会自动关闭,但是为了安全起见,最好还是通过调用close()方法来关闭文件。关闭文件的目的是释放文件对象占用的系统资源,防止文件被其他进程占用而无法读取或写入,同时也可以确保数据在写入文件之后被完全保存。例如:
动手练一练:
# 打开一个文件
file = open('test.txt', 'r') # “r”模式表示读取模式为只读模式
# 读取文件内容
print(file.read())
# 关闭文件
file.close()
上面的例子中,我们使用read()方法读取了文件内容,并使用close()方法关闭文件。需要注意的是,在使用close()方法之后,我们不能再次对文件进行读取或写入操作。如果需要再次对文件进行操作,必须再次打开文件。
对文件进行写操作之后一定要记得关闭文件,因为写入的数据可能会被缓存,如果程序或者系统因为某些原因崩溃了的话,缓存的数据是不会写入文件中的。所以安全起见,在使用完文件之后一定要记得关闭文件。
但如果每次打开文件之后,都需要我们显示地通过使用close()方法关闭文件,难免有时候会忘记关闭文件。对此,Python中引入了另一种关闭文件的方式,就是使用with语句。在with语句块中打开的文件会在语句块结束时自动关闭,无需显式调用close()方法。例如:
动手练一练:
# 使用with语句打开文件
with open('test.txt', 'r') as a:
# 读取文件内容
print(a.read())
上面的例子中,我们使用with语句打开一个名为test.txt的文件,并将其赋值给变量a。在with语句块中,我们可以执行任意数量的读取或写入操作。当程序执行完with语句块中的代码后,文件会自动关闭。
在Python中,关闭文件是一项重要的任务,可以防止数据丢失并释放系统资源。我们可以使用close()方法显式关闭文件,也可以使用with语句隐式关闭文件。无论使用哪种方式,关闭文件都是一项重要的操作,应该在文件使用完毕后及时执行。