python文件处理

前言

文件处理是任何 Web 应用程序的重要组成部分,当编写的程序需要将数据存储的时候,对于文件的读写操作也就必不可少了。python内置了几个用于处理文件的函数可供选择。
本文将简单介绍文本文件的打开、读取、写入、删除、关闭操作

文件打开

open()是python中用于打开文件的函数,以下是它的定义

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

open()函数一共有8个参数,但由于后面的七个参数均有默认值,所以实际上必须要提供的参数只有file,也就是文件名或者文件路径,在日常的使用中,一般我们只提供前两个参数就够了,所以此处也只详细介绍前两个参数
file 是一个 path-like object,表示将要打开的文件的路径(绝对路径或者当前工作目录的相对路径),也可以是要被封装的整数类型文件描述符。如果文件和python文件在同一目录下,那么只需要写文件名就够了
mode 是一个可选字符串,用于指定打开文件的模式。默认值是 'r' ,这意味着它以文本模式打开并读取。可用的模式有:

字符 模式 意义
'r' 读取 默认值,打开文件进行读取,如果文件不存在则报错
'w' 写入 打开文件进行写入,如果文件不存在则创建该文件。
'x' 创建 排它性创建,如果文件已存在则返回错误
'a' 追加 打开供追加的文件,如果不存在则创建该文件。

此外,还可以指定文件是应该作为二进制还是文本模式进行处理。

字符 模式 意义
‘t' 文本 默认值,文本模式
'b' 二进制 二进制模式
举个例子,现在我需要创建一个名为test.txt的文件,以下几种方式都可以实现。
open('test.txt','w')

上面这行代码它等同于f = open("test.txt", "rt")
如果是二进制文件,我们可以用

open('test.bat','wb')

但值得注意的是选择'x''r'的时候要注意文件是否已存在,那么有什么办法可以让我们知道文件到底有没有存在呢?简单,打开文件管理器看一下就好!开玩笑的,这里介绍两种方法

os模块

os模块中的os.path.exists()方法可以用于检验文件是否存在。

import os
os.path.exists('fileName.txt')

存在返回True,不存在返回False
当然这个方法还可以用来判断文件夹是否存在

import os
os.path.exists('folderName')

同样,存在返回True,不存在返回False
那如果出现文件夹名称和文件名相同怎么办?这时候我们可以用os.path.isfile()来检验

try语句

如果文件不存在那么就会抛出异常,那我们就可以通过捕获这个异常来判断文件是否存在,在使用open()函数时,如果文件不存在,那么会抛出FileNotFoundError的异常。

try:
    f = open()
    f.close()
except FileNotFoundError:
    print ("File is not found.")

文件读取

假设我们有一个文件demofile.txt且该文件与python文件处于一个相同的文件夹中,文件内容如下:

Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!

打开

如需打开文件,使用内建的 open() 函数。

open() 函数返回文件对象,此对象有一个 read() 方法用于读取文件的内容:

f = open("demofile.txt", "r")
print(f.read())

输出结果

Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!

需要注意的是,打开时要确保文件存在,否则会报错。

只读取文件的一部分

如果有时候我们不需要读取全部的文件内容,read()也可以指定要返回的字符数

f = open("demofile.txt", "r")
print(f.read(5))

上面这段程序就会只返回文件中的前五个字符。

Hello

读取一整行

readline()方法返回一行内容

f = open("demofile.txt", "r")
print(f.readline())

运行结果

Hello! Welcome to demofile.txt

如果我们需要读取多行,那我们可以循环调用该方法。
通过循环遍历文件中的行,可以逐行读取整个文件

f = open("demofile.txt", "r")
for x in f:
  print(x)

运行结果

Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!

也可以使用readlines(),与readline()不同的是,readlines()一次读取整个文件,像 read() 一样。readlines() 会自动将文件内容分析成一个行的列表
为了确保我们打开文件的时候不会出错,我们可以在打开语句外加上try语句或者先判断一下文件是否存在

# 使用os判断文件是否存在
import os
if os.path.exists('demofile.txt') == True:
    f = open('demofile.txt', 'r')
    print(f.read())

# 使用try语句
try:
    f = open('demofile.txt', 'r')
    print(f.read())
except FileNotFoundError:
    print("File is not found.")

文件写入

在已有文件中写入

这种情况对应的是open()函数中"a""w"两种参数

字符 模式 意义
'w' 写入 会覆盖任何已有的内容
'a' 追加 会追加到文件的末尾
举个例子
打开文件 demofile2.txt 并将内容追加到文件中:
f = open("demofile2.txt", "a")
f.write("Now the file has more content!")
f.close()

# 追加后,打开并读取该文件:
f = open("demofile2.txt", "r")
print(f.read())

运行结果

Hello! Welcome to demofile2.txt
This file is for testing purposes.
Good Luck!Now the file has more content!

这两个参数下使用open()函数都有一个共同点,文件存在那么直接写入,文件不存在就新建文件写入,也就是说不管怎么样我都要写进去。

创建新文件写入

这个时候我们很明确知道是需要创建新的文件的,那么"x""a""w"三个参数就都可以使用

字符 模式 意义
'w' 写入 如果指定的文件不存在,将创建一个文件
'x' 创建 排它性创建,如果文件已存在则返回错误
'a' 追加 如果指定的文件不存在,将创建一个文件
举个例子
创建名为 "myfile.txt" 的文件:
f = open("myfile.txt", "x")

文件删除

删除文件就必须要导入os模块了,os模块中的os.remove()方法可以用于删除文件。
举个例子
删除文件 demofile.txt

import os
os.remove("demofile.txt")

如果需要删除整个文件夹,可以用os.rmdir() 方法来实现
举个例子
删除文件夹 myfolder

import os
os.rmdir("myfolder")

但要注意的是这个方法只能用来删除空文件夹,如果删除的文件夹非空,就会出现如下错误

OSError: [WinError 145] 目录不是空的。: 'myfolder'

为避免出现错误,在尝试删除文件之前我们要检查该文件是否存在,具体方法前面讲了,这里也就不再重复了,最好的办法当然还是用try语句

文件关闭

关闭文件可以使用close()来实现

f = open("demofile.txt", "r")
print(f.readline())
f.close()

随时关闭文件绝对是一个好习惯,在某些情况下,由于缓冲,在关闭文件之前,对文件所做的更改可能不会显示。

参考文件

【1】 https://www.cnblogs.com/jhao/p/7243043.html#_label3
【2】https://www.w3school.com.cn/python/python_file_handling.asp

本博客同时发布在CSDN中 https://blog.csdn.net/tangkcc/article/details/113438361?spm=1001.2014.3001.5501

能力有限,如有错误之处,敬请指正!

posted @ 2021-01-31 14:03  小汤同学  阅读(194)  评论(0编辑  收藏  举报