# 读取原文件
f = open("bill.txt", 'r', encoding='utf-8')
lines = f.readlines()  # 按行读取,返回列表,每个元素是一行
f.close()

# 打开备份文件
file = open("bill.txt.bak", 'w', encoding='utf-8')

# 写入表头(第一行)
file.write(lines[0])

# 处理数据行(从第2行开始)
for line in lines[1:]:
    # 按逗号分割成列表
    parts = line.strip().split(',')
    # parts[4] 是备注列(因为索引从0开始:0姓名,1日期,2金额,3类型,4备注)
    if len(parts) > 4 and parts[4].strip() == '测试':
        continue  # 是测试数据,跳过
    else:
        file.write(line)  # 不是测试数据,写入备份文件

file.close()
print("备份完成,已过滤测试数据")

python

lines = f.readlines()  # 这一步已经完成了"按行分割"

执行完这一行后:

  • lines 已经是一个列表

  • 每个元素是一行字符串

text

lines = [
    "name, date, money, type, remarks\n",        # 索引0
    "周杰轮, 2022-01-01, 100000, 消费, 正式\n",  # 索引1
    "周杰轮, 2022-01-02, 300000, 收入, 正式\n",  # 索引2
    ...
]

所以后续只需要"按列操作"

python

for line in lines[1:]:           # 已经是一行一行的字符串了
    parts = line.strip().split(',')  # 只需要按列分割即可

完整流程对比

步骤 代码 作用
第1步 f.readlines() ✅ 按行分割 → 得到行列表
第2步 line.split(',') ✅ 按列分割 → 得到列列表
第3步 parts[4] ✅ 取出备注列

如果不使用 readlines() 会怎样?

那就需要手动按行分割:

python

# 方法1:用 read() + split('\n')
content = f.read()
lines = content.split('\n')  # 手动按行分割

# 方法2:直接遍历文件对象
lines = list(f)  # 等价于 readlines()

而且这个操作后不需要再单独写一个if not line.strip(): # 跳过空行 continue这个代码,只需要注意去掉后边的换行符或者其他什么东西就行,用这个代码 # 按逗号分割成列表 parts = line.strip().split(',')。

为什么不需要单独的 if not line.strip(): continue

原因:readlines() 的特性

python

lines = f.readlines()

readlines() 读取时:

  • 只会读取有内容的行

  • 不会产生空行元素

实际对比

假设文件内容:

text

name, date, money, type, remarks
周杰轮, 2022-01-01, 100000, 消费, 正式

林俊节, 2022-01-01, 300000, 收入, 正式

(中间有个空行)

用 read().split('\n')

python

content = f.read()
lines = content.split('\n')
# lines = ['第一行', '第二行', '', '第三行']  
#                                    ↑
#                                 会出现空字符串!

用 readlines()

python

lines = f.readlines()
# lines = ['第一行\n', '第二行\n', '第三行\n']
#        不会产生空行元素!

所以:

python

parts = line.strip().split(',')

这一行做了三件事:

  1. strip() → 去掉换行符 \n 和首尾空格

  2. 处理后的字符串按逗号分割

  3. 同时自然过滤了空行(因为空行 strip() 后是空字符串,但 readlines() 不产生空行)

读取方式 是否需要单独的 if not line.strip() 原因
f.read().split('\n') ✅ 需要 会产生空字符串元素
f.readlines() ❌ 不需要 不会产生空行元素

最后说一下:

方法归属对照表

方法 属于谁 作用
split() 字符串的方法 将字符串分割成列表
strip() 字符串的方法 去掉字符串首尾的空白字符

方法返回值详解

方法 调用对象 返回值类型 返回值内容 示例
strip() 字符串 字符串 去掉首尾空白字符后的新字符串 " hello ".strip() → "hello"
split() 字符串 列表 分割后得到的字符串列表 "a,b,c".split(',') → ['a','b','c']
代码 返回值类型 返回值示例
" hello ".strip() str "hello"
"a,b,c".split(',') list ['a','b','c']
"a b c".split() list ['a','b','c']
line.strip().split(',') list ['周杰轮', '2022-01-01', '100000', '消费', '正式']

关键记忆

  • strip() → 返回字符串

  • split() → 返回列表

  • 链式调用时,最终返回的是最后一个方法的返回值类型

核心要点

strip() 和 split() 都是字符串的方法,只是它们的返回值类型不同。

共同点与区别

共同点

python

# 两者都是字符串的方法,只能通过字符串调用
"  hello  ".strip()   # ✅ 字符串调用
"a,b,c".split(',')    # ✅ 字符串调用

[1,2,3].strip()       # ❌ 列表不能用
[1,2,3].split()       # ❌ 列表不能用

区别

python

# strip() 返回字符串
result = "  hello  ".strip()
print(type(result))  # <class 'str'>

# split() 返回列表
result = "a,b,c".split(',')
print(type(result))  # <class 'list'>

链式调用的理解

python

parts = line.strip().split(',')

可以理解为:

  1. line.strip() → 字符串方法,返回字符串

  2. 上一步返回的字符串再调用 .split(',') → 字符串方法,返回列表

关键:链式调用的每一步,都是在调用字符串的方法,因为中间返回值仍然是字符串。


一句话总结

strip() 和 split() 都是字符串的"工具",一个负责清理(返回字符串),一个负责切割(返回列表)。

更多推荐