跳转至
阅读量:

Python 学习之路——文件

文件在作为计算机的重要组成部分,程序本质上也是文件。很多时候我们需要将数据保存到本地,这个时候就需要对文件进行操作。

一、打开文件

在Python中,我们利用open()函数来打开一个文件。

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
- file:文件路径" - encoding:读取文件的编码格式,默认为"UTF-8" - buffering: 设置缓冲 - mode:打开文件的模式 - errors: 报错级别 - newline: 区分换行符 - closefd: 传入的file参数类型 - opener:自定义开启器

文件路径分为绝对路径和相对路径: 相对路径:如果目标文件和当前文件在同一级目录下,则直接使用文件名即可打开 绝对路径:从根目录开始书写,每一级直接用"/"隔开

打开文件的模式: | | | | ---- | ------------------------------------------------------------ | | t | 文本模式 (默认) | | x | 模式(新建一个文件,如果该文件已存在则会报错 ) | | b | 二进制模式 | | + | 打开一个文件进行更新(可读可写) | | r | 以只读方式打开文件,文件的指针在文件的开头(默认) | | rb | 以二进制格式打开一个文件用于只读,文件指针在文件的开头(默认模式) | | r+ | 打开一个文件用于读写,文件指针在文件的开头 | | rb+ | 以二进制格式打开一个文件用于读写。文件指针在文件的开头 | | w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑原有内容会被删除。如果该文件不存在,创建新文件 | | wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件 | | w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件 | | wb+ | 以二进制格式打开一个文件用于读写。如果该文件存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件 | | a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 | | ab | 以二进制格式打开一个文件用于追加。如果该文件存在,文件指针将会放在文件的结尾。新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 | | a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 | | ab+ | 以二进制格式打开一个文件用于追加。如果该文件存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写 | open函数会返回一个对象,该对象代表当前打开的文件。

二、关闭文件

当文件操作完毕后应当关闭文件,如果不关闭文件则会一直占用系统内存资源。 利用close()方法关闭文件

# 打开文件
f = open('python.txt', 'r')
# 关闭文件
f.close()

三、with语句

在Python中我们可以利用with语句打开文件。利用with语句打开文件,当文件操作完毕后自动关闭文件,不需要我们手动关闭,推荐在实际编写过程中使用with语句打开文件。

with open('Python.txt', 'r') as f:
    pass

# 和上述代码功能相同
f = open('Python.txt', 'r')
f.close()

四、文件的读写

一般文件的读写

读取文件:先将文件打开模式设置为可读取,再利用read()方法进行读取文件内容。 read()方法在读取文件时会一次性读取文件的所有内容,将它放到缓冲区。 写入文件:先将文件打开模式设置为可写入,再利用write()方法进行读取文件内容。write()方法可以将字符串写入文件中,并返回写入字符串地长度。

# 以读写模式打开文件
with open('Python.txt', 'w+') as f:
    # 写入文件
    f.write('Python')
    # 读取文件
    file = f.read()
print(file) # Python

大型文件的读写

由于read()和write()会一次性读取和写入文件,当文件较大时如果选择一次性读写,那么很有可能会造成内存资源消耗完毕,长时间停留在此操作,导致程序出现崩溃。 为了解决这个问题,我们选择在读写文件时进行限流处理,限制每一次读写文件的数量,以此来避免出现内存占用完毕的现象。

读取优化

设置size对read()方法限流: read()方法中可以接收一个size参数,这个参数代表了本次读取的文件的多少; 默认值为-1,代表读取整个文件; 当读取模式为文本模式时,size代表字符数量,当为二进制文件时,size代表字节数量。如果剩余数量小于size,那么则会将剩下的全部读取; read()方法每一次读取文件,都会从上一次读取结束位置开始。

with open('Python.txt', 'r') as f:
    file = ""
    while True:
        # 每次读取十个字符
        content = f.read(10)
        if not content:
            break
        file += content
    print('文件读取完毕')
使用readline()和readlinse()方法进行限流: readline()和readlines()方法读取文件时都是一行一行地读取文件。readlines()读取文件后会将读取到地文件封装到列表中返回。
with open('Python.txt', 'r') as f:
    file = ""
    while True:
        # 每次读取十个字符
        content = f.readline()
        if not content:
            break
        file += content

    # 效果一样
    content = f.readlines()
    for i in content:
        file += i
    print('文件读取完毕')

写入优化

利用writelines()方法写入文件,该方法在写入字符串时会进行迭代操作,以换行符为分隔进行迭代。

with open('Python.txt', 'w') as f:
    f.writelines('P\ny\n') # 内部写入时会分两次写入

文件指针操作

tell():返回文件的当前位置

with open('Python.txt', 'w+') as f:
    f.write('1:Python\n2:C++')
    print(f.readline())
    print('当前位置:', f.tell())

seek():用于移动文件读取指针到指定位置 语法:fileObject.seek(offset[, whence]) offset: 开始的偏移量,也就是代表需要移动偏移的字节数 whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

with open('Python.txt', 'w+') as f:
    f.write('1:Python\n2:C++')
    a = f.readline()
    print(a) # 1:Python
    f.seek(10, 0)
    b = f.readline()
    print(b) # 1:Python

五、os模块

os 模块是Python地一个内置模块,它提供了非常丰富的方法用来处理文件和目录。 常用方法: - listdir() :获取当前目录结构 - chdir():切换盘符 - getcwd() :获取当前所在的目录 - mkdir():创建目录 在当前目录创建 - rmdir():删除目录 - open():打开文件,设置打开选项,mode参数可选 - remove():删除指定路径的文件

评论