坚持
  • 微信
当前位置:首页 > PYTHON >

文件操作(1)

作者:管理员 时间:2026-07-03 阅读数: 535人阅读

 一、文件操作概述

一个完整的程序一般都包括数据的存储和读取。前面写的程序数据都没有进行实际的存储,因此Python解释器执行完数据就消失了。实际开发中,经常需要从外部存储介质(硬盘、光盘、U盘等)读取数据,或者将程序产生的数据存储到文件中,实现"持久化"保存。

很多软件系统将数据存储到数据库中,数据库实际也是基于文件形式存储的。

  文本文件和二进制文件

文本文件:存储普通"字符"文本,Python默认为unicode字符集(两个字节表示一个字符,最多可表示65536个),可以使用记事本程序打开。

二进制文件:把数据内容用"字节"进行存储,无法用记事本打开,必须使用专用的软件解码。常见的有:MP4视频文件、MP3音频文件、JPG图片、doc文档等。

  二、文件操作相关模块概述

模块名称

说明

io模块

文件流的输入和输出操作(input/output)

os模块

基本操作系统功能,包括文件操作

glob模块

查找符合特定规则的文件路径名

fnmatch模块

使用模式来匹配文件路径名

fileinput模块

处理多个输入文件

filecmp模块

用于文件的比较

csv模块

用于csv文件处理

pickle和cPickle

用于序列化和反序列化

xml包

用于XML数据处理

bz2、gzip、zipfile、zlib、tarfile

用于处理压缩和解压缩文件(分别对应不同的算法)

  三、创建文件对象open()

open()函数用于创建文件对象,基本语法格式:open(文件名[, 打开方式])

如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,如 D:\a\b.txt。为了减少\的输入,可以使用原始字符串:r"d:\b.txt"

 

f = open(r"d:\b.txt", "w")

 

打开方式如下表:

模式

描述

r

read模式

w

write模式。文件不存在则创建;文件存在则重写新内容

a

追加 append模式。文件不存在则创建;文件存在则在文件末尾追加内容

b

二进制 binary模式(可与其他模式组合使用)

+

读、写模式(可与其他模式组合使用)

 

如果没有增加模式 b,则默认创建的是文本文件对象,处理的基本单元是"字符"。

如果是二进制模式 b,则创建的是二进制文件对象,处理的基本单元是"字节"。

  四、文本文件的写入

文本文件的写入一般就是三个步骤:

创建文件对象

写入数据

关闭文件对象

示例:文本写入操作简单测试

 

f = open(r"a.txt", "a")

s = "itbaizhan\nsxt\n"

f.write(s)

f.close()

 

示例:使用with上下文管理写入

 

with open(r"a.txt", "a") as f:

    s = "itbaizhan\nsxt\n"

f.write(s)

 

  五、常用编码介绍

在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问题。

 

  ASCII

全称为 American Standard Code for Information Interchange,美国信息交换标准代码。用7位表示,只能表示128个字符。0~31表示控制字符;32~126表示打印字符。48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122为26个小写英文字母。

 

  ISO8859-1

又称 Latin-1,是一个8位单字节字符集。把ASCII的最 高位也利用起来,并兼容了ASCII。在ASCII编码之上又增加了西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。

 

  GB2312 / GBK / GB18030

GB2312:1980年发布,主要收录了6763个汉字、682个符号。完全兼容ISO8859-1。

GBK:1995年制定,扩展了GB2312,一共收录了21003个汉字。

GB18030:2000年发布,包含了中国大部分少数民族的语言字符,收录汉字数超过70000余个。向下兼容GB2312和GBK。

 

  Unicode

Unicode编码设计成了固定两个字节,所有的字符都用16位(2^16=65536)表示,包括之前只占8位的英文字符等,所以会造成空间的浪费。Unicode完全重新设计,不兼容ISO8859-1,也不兼容任何其他编码。

 

  UTF-8

UTF-8全称是 8-bit Unicode Transformation Format。编码兼容ISO8859-1,同时也可以用来表示所有语言的字符。UTF-8是不定长编码,每一个字符的长度从1-4个字节不等。其中,英文字母都是用一个字节表示,而汉字使用三个字节。

一般项目都会使用 UTF-8。

 

  中文乱码问题

操作系统默认的编码:Windows是GBK,Linux是UTF-8。当用open()时,调用的是操作系统打开的文件,默认的编码是GBK。

示例:中文字符文件,乱码出现测试

 

#测试写入中文

f = open(r"b.txt", "w")

f.write("尚学堂\n百战程序员\n")

f.close()

 

示例:通过指定文件编码解决中文乱码问题

 

#测试写入中文

f = open(r"b.txt", "w", encoding="utf-8")

f.write("尚学堂\n百战程序员\n")

f.close()

 

  六、write()/writelines()写入数据

write(a):把字符串a写入到文件中

writelines(b):把字符串列表写入文件中,不添加换行符

示例:添加字符串列表数据到文件中

 

f = open(r"d:\bb.txt", "w", encoding="utf-8")

s = ["高淇\n", "高老三\n", "高老四\n"]

f.writelines(s)

f.close()

 

  七、close()关闭文件流

由于文件底层是由操作系统控制,打开的文件对象必须显式调用close()方法关闭。当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法),再关闭文件,释放文件对象。

为了确保打开的文件对象正常关闭,一般结合异常机制的finally或者with关键字实现无论何种情况都能关闭打开的文件对象。

示例:结合异常机制的finally,确保关闭文件对象

 

try:

    f = open(r"my01.txt", "a")

    s = "gaoqi"

    f.write(s)

except BaseException as e:

    print(e)

finally:

f.close()

 

  八、with语句(上下文管理器)

with关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。

示例:使用with管理文件写入操作

 

s = ["高淇\n", "高老三\n", "高老五\n"]

with open(r"d:\bb.txt", "w") as f:

f.writelines(s)

 

  九、文本文件的读取

文件的读取一般使用如下三个方法:

read([size]):从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件。读取到文件末尾,会返回空字符串。

readline():读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。

readlines():文本文件中,每一行作为一个字符串存入列表中,返回该列表。

示例:读取一个文件前4个字符

 

with open(r"a.txt", "r", encoding="utf-8") as f:

    print(f.read(4))

 

示例:文件较小,一次将文件内容读入到程序中

 

with open(r"d:\bb.txt", "r") as f:

print(f.read())

 

示例:按行读取一个文件

 

with open(r"bb.txt", "r") as f:

    while True:

        fragment = f.readline()

        if not fragment:

            break

        else:

            print(fragment, end="")

 

示例:使用迭代器(每次返回一行)读取文本文件

 

with open(r"d:\bb.txt", "r") as f:

    for a in f:

        print(a, end="")

 

示例:为文本文件每一行的末尾增加行号

 

with open("b.txt", "r", encoding="utf-8") as f:

    lines = f.readlines()

    lines2 = [line.rstrip() + " #" + str(index) + "\n" for index, line in zip(range(1, len(lines) + 1), lines)]

with open("b.txt", "w", encoding="utf-8") as f:

f.writelines(lines2)

 


上一篇:

下一篇: