python的文件数据处理(2)
·
# 读取原文件
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(',')
这一行做了三件事:
-
strip()→ 去掉换行符\n和首尾空格 -
处理后的字符串按逗号分割
-
同时自然过滤了空行(因为空行
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(',')
可以理解为:
-
line.strip()→ 字符串方法,返回字符串 -
上一步返回的字符串再调用
.split(',')→ 字符串方法,返回列表
关键:链式调用的每一步,都是在调用字符串的方法,因为中间返回值仍然是字符串。
一句话总结
strip()和split()都是字符串的"工具",一个负责清理(返回字符串),一个负责切割(返回列表)。
更多推荐


所有评论(0)