当前位置:首页>python>第二十六课:Python中的文件读写(二)

第二十六课:Python中的文件读写(二)

  • 2026-10-21 13:29:10
第二十六课:Python中的文件读写(二)
在上一节的分享当中我们讲了Python中文件的写入,还讲了各种模式、关于字符集的问题、with的方式打开一个文件,以及CSV文件格式的特点。那么我们这节课来讲讲文件的读。就是从硬盘文件中把内容显示出来。
上课节我们除了分享写文件,已经把读写文件的基础也分享了,这里我们主要来分享点读文件的知识。
读文件的程序基本结构:
f = open('example.txt', 'r')content = f.read()print(content)f.close()
用with模式来写,如下:
with open('example.txt', 'r') as f:    content = f.read()    print(content)# 文件在此自动关闭,即使发生异常
这里用的read(),在读文件中有三个方法:
方法
作用
read()
读取整个文件为字符串
readline()
读取一行(包括换行符 `\n`)
readlines()
读取所有行,返回列表(每行一个元素)
迭代文件对象
高效逐行读取(推荐用于大文件)
# 读全部with open('data.txt') as f:    data = f.read()# 逐行读(内存友好)with open('large.log') as f:    for line in f:        process(line.strip())  # 去掉换行符
对于大文件(GB 级),避免 read() 或 readlines(),应使用逐行迭代。
讲到这个去掉换行符,我得举个例子来讲讲,我们可以这样来写代码:
f = open('city.csv', 'r')c = f.read().strip('\n').split(',')f.close()print(c)

c = f.read().strip('\n').split(',')

这一行做了三件事,从左到右链式调用:
1. f.read()读取整个文件内容,返回一个字符串。假设 city.csv 内容是:
Beijing,Shanghai,Guangzhou,Shenzhen
那么 f.read() 返回 "Beijing,Shanghai,Guangzhou,Shenzhen\n"(末尾可能带换行符)
2. .strip('\n')
  • 移除字符串开头和结尾的换行符 \n。
  • 注意:它不会移除中间的换行符,只处理首尾。
  • 如果文件最后一行没有换行符,这步无效;如果有,会去掉末尾 \n。
3. .split(',')
  • 用逗号 , 分割字符串,返回一个列表。
  • 结果:['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']

 所以 c 是一个包含城市名的列表。

讲完了这个我们再来看看,上面的三个方法的区别:
read()、readline()、readlines()区别
read()函数 一次性可以读取整个文件,然后返回一个字符串。由此可见,如果对于小文本来说的话那么这个读取操作显然是流畅的,如果对于大文件的读取速度相对比较慢。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
# 假设有一个大文件 big_file.txtchunk_size = 1024  # 每次读 1KBwith open('big_file.txt', 'r', encoding='utf-8') as f:    while True:        chunk = f.read(chunk_size)   # 读取最多 1024 个字符(文本模式)        if not chunk:                # 读到文件末尾,返回空字符串            break        # 处理这一块数据(例如打印、写入、分析等)        print(f"读取了 {len(chunk)} 个字符")        # 这里可以做你的业务逻辑,比如搜索关键词、计算哈希等
readline() 函数一次只读取文件的一行,返回的类型是一个字符串类型。
readlines()函数从文件的第一行读取到文件的最后一行,返回的类型是一个列表类型。
注意:每个方法返回的类型一定要记住,考试会考。
这里我们举几个,读写的例子:

1. 按块读取(适用于二进制或超大文件)

# 直接打开文件并分块读取file_path = 'huge_file.bin'chunk_size = 1024  # 每次读取 1024 字节(1KB)with open(file_path, 'rb') as f:    while True:        chunk = f.read(chunk_size)  # 读取一块数据        if not chunk:               # 如果读到文件末尾(返回空 bytes)            break                   # 跳出循环        # 处理当前数据块        process(chunk)              # 替换为你的实际处理逻辑
process(chunk)并不是 Python 的内置函数,而是一个占位符(placeholder),用来表示“在这里对读取到的数据块 chunk 做你想要的处理”。换句话说:你需要把它替换成你自己的实际代码逻辑。

2. 日志分析

error_count = 0with open('app.log') as f:    for line in f:        if 'ERROR' in line:            error_count += 1print(f"共 {error_count} 条错误日志")

3. 配置文件加载

# config.ini 内容:# [server]# host = localhost# port = 8080import configparserconfig = configparser.ConfigParser()config.read('config.ini')host = config['server']['host']
4. 读取二进制文件(如图片)并处理
import hashlibimport os# 文件路径(请确保当前目录下有 image.jpg,或修改为你的实际路径)file_path = 'image.jpg'# 检查文件是否存在if not os.path.exists(file_path):    print(f"错误:文件 {file_path} 不存在!")else:    # 以二进制只读模式打开文件    with open(file_path, 'rb') as f:        data = f.read()  # 一次性读取全部内容,data 是 bytes 类型    # --- 示例 1:计算文件的 MD5 哈希值 ---    md5_hash = hashlib.md5(data).hexdigest()    print(f"MD5 哈希: {md5_hash}")    # --- 示例 2:将读取的数据写入新文件(实现复制)---    output_path = 'copy_of_image.jpg'    with open(output_path, 'wb') as out_file:        out_file.write(data)    print(f"已复制图片到 {output_path}")    # --- 示例 3:获取文件大小 ---    size = len(data)    print(f"文件大小: {size} 字节 ({size / 1024:.2f} KB)")    # --- 示例 4:准备用于网络传输(例如模拟发送)---    # 在真实场景中,你可能会用 requests、socket 或上传 SDK 发送 data    print(f"数据类型: {type(data)}")  # <class 'bytes'>    print("前10字节(十六进制):", data[:10].hex())  # 查看文件头(JPEG 通常以 ff d8 开头)

5. 把大文件复制到另一个文件

withopen('output.bin', 'wb') asout:    with open('huge_file.bin', 'rb') as f:        while True:            chunk = f.read(1024)            if not chunk:                break            out.write(chunk)  # 写入目标文件
补充:Python字符串中一个汉字占几个字节?
Python中字符汉字在utf-8编码下占三个字节,在gbk编码下占两个字节。
1、Python中汉字在utf-8编码下示例:
2、Python中汉字在gbk编码下示例:
next方法在编程中也经常用到
next() 是 Python 的一个内置函数(built-in function),用于从**迭代器(iterator)**中手动获取下一个元素。
很简单的例子:
numbers = iter([10, 20, 30])  # 创建一个迭代器print(next(numbers))  # 输出: 10print(next(numbers))  # 输出: 20print(next(numbers))  # 输出: 30# print(next(numbers))  # 报错!StopIteration#后面跟个默认值numbers = iter([1, 2])print(next(numbers, "没了"))  # 1print(next(numbers, "没了"))  # 2print(next(numbers, "没了"))  # "没了" (不再报错)
一般实际开发中不是这样的结构。
写一个比较理想化的结构,只用于理解:
# 原始 for 循环for item in iterable:    print(item)# 理想化版本,实际不可行,仅用于理解流程it = iter(iterable)while True:    item = next(it)      # ← 此处隐含:当无元素时应自动停止(实际需异常)    print(item)    # (教学时口头说明:“当没元素时,循环结束”)
只用于理解next只用于理解next只用于理解next。关注,沟通、交流

最新文章

随机文章