文章目录
- 一 文件的编码认识
- 二 python文件操作
- 2.1 open()打开函数
- 2.2 mode常用的访问模式
- 2.3 `open`函数的文件对象
- 2.4 文件读操作
- 2.5 练习案例:单词计数
- 三 文件的写入
- 四 操作综合案例
- 4.1 需求
- 4.2 实现思路
- 4.3 参考代码1.0
- 4.4 参考代码2.0
一 文件的编码认识
- 文件编码是指将文本或数据转换为计算机可以理解和处理的二进制形式的过程。在计算机中,所有的数据都是以二进制形式存储和处理的,而文本数据也不例外。
- 不同的字符集和语言有不同的编码方式,用于将字符映射到二进制数据。以下是一些常见的文件编码:
-
ASCII(美国标准码):最早的字符编码之一,用于表示英文字母、数字和一些常用符号。它使用7位二进制数表示字符,共计128个字符。
-
UTF-8(Unicode转换格式-8位):一种通用的字符编码,可以表示世界上几乎所有的字符,包括各种语言的文字和特殊符号。UTF-8使用可变长度的编码方式,一个字符可以占用1到4个字节。
-
UTF-16(Unicode转换格式-16位):另一种Unicode编码方式,它使用16位二进制数表示字符,可以表示更多的字符,但在某些情况下会浪费存储空间。
-
UTF-32(Unicode转换格式-32位):使用32位二进制数表示每个字符,能够表示更广泛的Unicode字符范围,但同样会浪费存储空间。
-
ISO-8859系列:一系列字符编码,每个编码用于特定的字符集,如ISO-8859-1用于西欧语言字符,ISO-8859-5用于西里尔字母等。
-
GB2312、GBK、GB18030:主要用于中文字符的编码,GB2312是早期的中文编码,GBK和GB18030对字符集进行了扩展,以支持更多的字符。
-
Big5:用于繁体中文字符的编码,主要用于台湾和香港地区。
- 在读写文件时,需要确保使用与文件编码一致的字符编码,以避免出现乱码或错误的情况。
- 在编程中,常见的做法是使用UTF-8编码,因为它支持广泛的字符范围,适用于多种语言和场景。
二 python文件操作
- 一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
- 操作系统以文件为单位管理磁盘中的数据。
- 平常对文件的基本操作,大概可以分为三个步骤:
① 打开文件
② 读写文件
③ 关闭文件
- 注意:可以只打开和关闭文件,不进行任何读写
2.1 open()打开函数
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
file
:要打开的文件的路径。mode
:打开文件的模式,可以是'r'
(只读)、'w'
(只写,如果文件已存在则覆盖)、'a'
(追加)、'b'
(二进制模式,如'rb'
)、't'
(文本模式,如'rt'
)等。buffering
:缓冲设置,控制读写操作的缓冲行为。通常为-1
(系统默认缓冲方式)、0
(无缓冲)、正整数(缓冲区大小)。encoding
:指定读写文件时使用的字符编码(仅在文本模式下有效)。errors
:指定在编解码错误时的处理方式。newline
:控制换行符的处理,可以是None
(使用系统默认)、''
(不转换换行符)、'\n'
(强制使用换行符)等。closefd
:如果为True
(默认),则关闭文件描述符。对于文件名、文件描述符和文件对象都有效。opener
:自定义打开文件的函数,通常不需要使用。
示例:
# 以只读模式打开文件
with open('example.txt', 'r') as file:content = file.read()print(content)# 以写入模式创建或覆盖文件
with open('output.txt', 'w') as file:file.write('Hello, World!')# 以追加模式打开文件
with open('log.txt', 'a') as file:file.write('New log entry')# 以二进制模式读取图片文件
with open('image.jpg', 'rb') as file:image_data = file.read()# 以文本模式读取文件,并指定字符编码
with open('data.txt', 'r', encoding='utf-8') as file:content = file.read()# 以写入模式打开文件,并指定字符编码为UTF-8
with open('output.txt', 'w', encoding='utf-8') as file:file.write('Hello, World!')# 以只读模式打开文件,并指定字符编码为UTF-8
with open('example.txt', 'r', encoding='utf-8') as file:content = file.read()print(content)
- 注意:在使用
open()
打开文件后,务必在合适的地方使用close()
方法关闭文件,或者更好的方式是使用with
语句块,它会在退出代码块时自动关闭文件,避免资源泄露和错误。
2.2 mode常用的访问模式
- 当使用Python的
open()
函数打开文件时,可以通过mode
参数指定访问模式。
模式 | 描述 |
---|---|
'r' | 读取模式,打开文件进行读取。如果文件不存在,会引发错误。 |
'w' | 写入模式,打开文件进行写入。如果文件存在,会截断文件内容;如果文件不存在,会创建新文件。 |
'a' | 追加模式,打开文件进行写入,但不截断文件内容。如果文件不存在,会创建新文件。 |
'b' | 二进制模式,用于读取或写入二进制数据。可以与其他模式一起使用,如 'rb' 或 'wb' 。 |
't' | 文本模式,用于读取或写入文本数据(默认模式)。可以与其他模式一起使用,如 'rt' 或 'wt' 。 |
'x' | 独占创建模式,用于创建新文件,如果文件已经存在则引发错误。 |
'+' | 读写模式,可以同时读取和写入文件。可以与其他模式一起使用,如 'r+' 或 'w+' 。 |
2.3 open
函数的文件对象
open()
函数返回一个文件对象,通过该对象可以对文件进行读写操作。文件对象提供了多个方法来读取和写入文件内容。
-
read(size=-1)
:从文件中读取指定数量的字符(字节),如果未指定数量,则会读取整个文件内容。返回值是一个包含读取内容的字符串。 -
readline()
:从文件中读取一行内容,包括行末换行符。返回值是一个字符串,如果到达文件末尾,则返回空字符串。 -
readlines()
:从文件中读取所有行,将其存储在列表中,每一行是列表中的一个元素。 -
write(string)
:将给定的字符串写入文件。返回值是写入的字符数。 -
writelines(lines)
:将字符串列表写入文件,不添加额外的换行符。 -
seek(offset, whence=0)
:移动文件指针到指定位置。offset
表示偏移量,whence
指定偏移相对位置(0表示文件开头,1表示当前位置,2表示文件末尾)。 -
tell()
:返回当前文件指针的位置。 -
close()
:关闭文件。在文件操作结束后应该调用这个方法以释放文件资源。 -
flush()
:将缓冲区中的数据立即写入文件。 -
__enter__()
和__exit__()
:用于支持with
语句块,自动管理文件的打开和关闭。
示例使用:
with open('example.txt', 'r') as file:content = file.read()print(content)with open('output.txt', 'w') as file:file.write('Hello, World!')with open('data.txt', 'r') as file:for line in file:print(line)with open('lines.txt', 'w') as file:lines = ['Line 1\n', 'Line 2\n', 'Line 3\n']file.writelines(lines)
2.4 文件读操作
- 在Python中,可以使用文件对象的方法来进行文件读取操作。以下是一些常用的文件读取操作相关的方法:
read(size=-1)
:从文件中读取指定数量的字符(字节),如果未指定数量,则会读取整个文件内容。返回一个包含读取内容的字符串。
with open('example.txt', 'r') as file:content = file.read()print(content)
readline()
:从文件中读取一行内容,包括行末换行符。返回一个字符串,如果到达文件末尾,则返回空字符串。
with open('example.txt', 'r') as file:line = file.readline()print(line)
readlines()
:从文件中读取所有行,将其存储在列表中,每一行是列表中的一个元素。
with open('example.txt', 'r') as file:lines = file.readlines()for line in lines:print(line)
- 迭代文件对象:文件对象本身也是可迭代的,可以在循环中逐行读取文件内容。
with open('example.txt', 'r') as file:for line in file:print(line)
- 注意:文件的读取操作可能会引发异常,特别是当文件不存在或权限不足时。因此,在进行文件读取操作时,最好使用异常处理来捕获潜在的问题。
2.5 练习案例:单词计数
- 通过Windows的文本编辑器软件,将如下内容,复制并保存到:word.txt,文件可以存储在任意位置
itheima itcast python
itheima python itcast
beijing shanghai itheima
shenzhen guangzhou itheima
wuhan hangzhou itheima
zhengzhou bigdata itheima
- 通过文件读取操作,读取此文件,统计itheima单词出现的次数
# 打开文件,以读取模式打开
f = open("D:/word.txt", "r", encoding="UTF-8")
# 方式1:读取全部内容,通过字符串count方法统计itheima单词数量content = f.read()count = content.count("itheima")print(f"itheima在文件中出现了:{count}次")
# 方式2:读取内容,一行一行读取
count = 0 # 使用count变量来累计itheima出现的次数
for line in f:line = line.strip() # 去除开头和结尾的空格以及换行符words = line.split(" ")for word in words:if word == "itheima":count += 1 # 如果单词是itheima,进行数量的累加加1
# 判断单词出现次数并累计
print(f"itheima出现的次数是:{count}")
# 关闭文件
f.close()
三 文件的写入
- 以下是一些常用的文件写入操作方法:
- 文件如果不存在,使用”w”模式,会创建新文件
- 文件如果存在,使用”w”模式,会将原有内容清空
-
write(string)
:将给定的字符串写入文件,返回值是写入的字符数。with open('output.txt', 'w') as file:file.write('Hello, World!')
-
writelines(lines)
:将字符串列表写入文件,不添加额外的换行符。lines = ['Line 1\n', 'Line 2\n', 'Line 3\n'] with open('lines.txt', 'w') as file:file.writelines(lines)
-
文件迭代器写入:通过循环将内容逐行写入文件。
lines = ['Line 1', 'Line 2', 'Line 3'] with open('lines.txt', 'w') as file:for line in lines:file.write(line + '\n')
-
flush()
:将缓冲区中的数据立即写入文件。with open('output.txt', 'w') as file:file.write('Hello')file.flush() # 立即将数据写入文件
-
追加模式:使用
'a'
模式来追加内容到文件而不覆盖已有内容。with open('log.txt', 'a') as file:file.write('New log entry')
- a模式,文件不存在会创建文件
- a模式,文件存在会在最后,追加写入文件
-
在使用 with 语句块的情况下,通常不需要显式地调用 flush() 方法,因为 with 块结束时会自动执行必要的刷新操作。只有在需要强制刷新缓冲区的特殊情况下才需要使用 flush() 方法。
-
在使用完毕后,记得关闭文件以释放资源,最好的做法是使用
with
语句块。 -
文件的写入操作也可能会引发异常,特别是当文件无法写入或权限不足时。在进行文件写入操作时,最好使用异常处理来捕获潜在的问题。
四 操作综合案例
- 有一份账单文件,记录了消费收入的具体记录,可以将内容复制并保存为 bill.txt文件,内容如下:
name,date,money,type,remarks 周杰轮,2022-01-01,100000,消费,正式 周杰轮,2022-01-02,300000,收入,正式 周杰轮,2022-01-03,100000,消费,测试 林俊节,2022-01-01,300000,收入,正式 林俊节,2022-01-02,100000,消费,测试 林俊节,2022-01-03,100000,消费,正式 林俊节,2022-01-04,100000,消费,测试 林俊节,2022-01-05,500000,收入,正式 张学油,2022-01-01,100000,消费,正式 张学油,2022-01-02,500000,收入,正式 张学油,2022-01-03,900000,收入,测试 王力鸿,2022-01-01,500000,消费,正式 王力鸿,2022-01-02,300000,消费,测试 王力鸿,2022-01-03,950000,收入,正式 刘德滑,2022-01-01,300000,消费,测试 刘德滑,2022-01-02,100000,消费,正式 刘德滑,2022-01-03,300000,消费,正式
4.1 需求
- 读取文件
- 将文件写出到bill.txt.bak文件作为备份
- 同时,将文件内标记为测试的数据行丢弃
4.2 实现思路
- open和r模式打开一个文件对象,并读取文件
- open和w模式打开另一个文件对象,用于文件写出
- for循环内容,判断是否是测试不是测试就write写出,是测试就continue跳过
4.3 参考代码1.0
source_file = "C:/Users/HP/Desktop/bill.txt"
target_file = "C:/Users/HP/Desktop/bill.txt.bak"
# 打开源文件进行读取,并创建目标文件进行写入
with open(source_file, "r", encoding="UTF-8") as fr, open(target_file, "w", encoding="UTF-8") as fw:# for循环读取文件for line in fr:line = line.strip()# 判断内容,将满足的内容写出if line.split(",")[4] == "测试":continue # continue进入下一次循环,这一次后面的内容就跳过了# 将内容写出去fw.write(line)# 由于前面对内容进行了strip()的操作,所以要手动的写出换行符fw.write("\n")
4.4 参考代码2.0
source_file = "C:/Users/HP/Desktop/bill.txt"
target_file = "C:/Users/HP/Desktop/bill.txt.bak"
# 打开源文件进行读取,并创建目标文件进行写入
with open(source_file, "r", encoding="UTF-8") as fr, open(target_file, "w", encoding="UTF-8") as fw:for line in fr:if "测试" in line:continuefw.write(line)