飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 认识Python

    • Python 历史与特点
    • Python 2 与 Python 3 的核心差异
    • 安装与运行 Python 2.7.18
    • 编码规范 PEP 8
  • 第2章 基础语法

    • 变量与对象
    • 数字类型
    • 字符串 str
    • Unicode 字符串
    • 运算符
    • 空值 None
  • 第3章 流程控制

    • if 条件语句
    • if-else 条件语句
    • if-elif-else 多分支
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 与 xrange
    • 循环控制:break、continue、pass
    • 循环 else 子句
  • 第4章 数据结构

    • 列表基础
    • 列表方法
    • 列表推导式
    • 元组
    • 字典基础
    • 字典方法
    • 字典循环技巧
    • 集合
    • 序列解包
    • 序列比较
  • 第5章 函数

    • 定义函数
    • 参数传递机制
    • 默认参数
    • 关键字参数
    • 可变参数
    • Lambda 表达式
    • 文档字符串
    • 函数对象
  • 第6章 模块与包

    • import 导入
    • 模块搜索路径
    • name 与主程序
    • 编译文件 .pyc 与 .pyo
    • 包结构
    • dir() 函数
  • 第7章 文件与IO

    • 打开与关闭文件
    • 文件读写方法
    • with 上下文管理器
    • 格式化输出:% 操作符
    • 格式化输出:str.format()
    • JSON 序列化
  • 第8章 面向对象

    • 类定义与实例化
    • init 构造方法
    • 类变量与实例变量
    • 方法调用与 self
    • 继承基础
    • 多重继承
    • 新式类与旧式类
    • 私有变量与名称改写
    • 属性装饰器 property
    • 类方法与静态方法
    • 魔术方法
    • 空类与数据记录
  • 第9章 异常处理

    • 异常类型
    • try-except
    • try-except-else-finally
    • 抛出异常 raise
    • 自定义异常
    • with 语句与上下文管理器
  • 第10章 迭代器与生成器

    • 迭代器协议
    • 生成器函数
    • 生成器表达式
    • itertools模块
  • 第11章 标准库精要

    • os模块
    • sys模块
    • datetime模块
    • re模块
    • json模块
    • collections模块
    • math与random模块
    • urllib2与网络请求
    • subprocess与命令执行
    • threading与并发
    • unittest与测试
    • 虚拟环境与包管理
  • 第12章 工程实践

    • 调试技巧
    • 性能分析
    • 文档与注释
    • 下一步学习

文件读写方法

文件对象提供了一系列方法用于读取和写入数据。根据需求选择合适的方法,可以显著提高效率和代码清晰度。

读取方法

read(size=-1):读取全部或指定字节/字符

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

# 读取全部内容
content = f.read()
print len(content)      # 文件总长度

# 读取指定字节数
chunk = f.read(100)     # 读取最多 100 字节

read() 返回字符串(文本模式)或字节串(二进制模式)。大文件用 read() 会一次性加载到内存,可能耗尽 RAM。

readline():读取一行(包含末尾的换行符 \n)

f = open("data.txt", "r")
line = f.readline()
print repr(line)        # 'First line\n'

line = f.readline()
print repr(line)        # 'Second line\n'

line = f.readline()
print repr(line)        # ''(空字符串表示 EOF)

readlines():读取所有行,返回列表

f = open("data.txt", "r")
lines = f.readlines()
print lines             # ['First line\n', 'Second line\n', 'Third line\n']

readlines() 可以指定 sizehint 参数,读取大约这么多字节(非精确值):

lines = f.readlines(1024)   # 读取约 1KB 的内容

逐行迭代(推荐):

f = open("data.txt", "r")
for line in f:
    print line.strip()      # 去除换行符

这是读取大文件最内存高效的方式——每次只加载一行到内存,而非整个文件。

写入方法

write(string):写入字符串

f = open("output.txt", "w")
f.write("Hello, world\n")
f.write("Second line\n")
f.close()

write() 不自动添加换行符,需要手动写入 \n。

writelines(lines):写入序列

lines = ["Line 1\n", "Line 2\n", "Line 3\n"]
f = open("output.txt", "w")
f.writelines(lines)
f.close()

writelines() 不会自动添加换行符,序列中的每个元素必须已经包含 \n。

文件定位

文件对象维护一个"文件指针",记录当前读写位置。

tell():返回当前位置

f = open("data.txt", "r")
print f.tell()          # 0,开头
f.read(10)
print f.tell()          # 10

seek(offset, whence=0):移动文件指针

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

f.seek(0)               # 移动到开头(whence=0,默认)
f.seek(10)              # 移动到第 10 字节
f.seek(-5, 2)           # 从末尾向前移动 5 字节(whence=2)
f.seek(5, 1)            # 从当前位置向前移动 5 字节(whence=1)

whence 参数:

  • 0(默认):从文件开头计算
  • 1:从当前位置计算
  • 2:从文件末尾计算

⚠️ 文本模式下,seek() 的行为在 Windows 上可能不符合预期(因为 \r\n 被转换为 \n)。二进制模式下 seek() 最可靠。

实际应用

读取大文件:

# 方法 1:逐行迭代(最省内存)
with open("huge_file.txt", "r") as f:
    for line in f:
        process(line)

# 方法 2:分块读取
with open("huge_file.txt", "r") as f:
    while True:
        chunk = f.read(8192)    # 8KB 一块
        if not chunk:
            break
        process(chunk)

追加日志:

with open("app.log", "a") as f:
    f.write("[%s] %s\n" % (time.strftime("%Y-%m-%d %H:%M:%S"), message))

复制文件:

with open("source.bin", "rb") as src:
    with open("dest.bin", "wb") as dst:
        while True:
            chunk = src.read(4096)
            if not chunk:
                break
            dst.write(chunk)

文件对象的属性

f = open("data.txt", "r")
print f.name            # data.txt
print f.mode            # r
print f.closed          # False
f.close()
print f.closed          # True

常见错误

在关闭后操作:

f = open("data.txt", "r")
f.close()
f.read()                # ValueError: I/O operation on closed file

在文本模式下处理二进制数据:

f = open("image.jpg", "r")      # 应该用 "rb"!
data = f.read()
# 图片数据可能被损坏(Windows 上 \r\n 被转换)

忘记处理换行符:

for line in f:
    if line == "target":      # 永远不会匹配!line 包含 \n
        pass

# 正确做法
for line in f:
    if line.strip() == "target":
        pass
上一页
打开与关闭文件
下一页
with 上下文管理器