当前位置:首页 > 休闲

python 怎么遍历文件里的数据

打开一个文件,遍历读出里面的文件每一行,这是数据Python里最日常的操作。但你真去遍历的遍历时候,会发现坑比想象的文件多——编码问题、大文件内存爆炸、数据空行干扰、遍历数据格式混乱。文件别急,数据咱们从最朴素的遍历写法开始。

最直接的文件方案是for line in open('data.txt')。这行代码背后,数据Python按行读取文件对象,遍历每次迭代只取一行,文件内存里永远只存当前行。数据十万行的日志文件,这么读毫无压力。但有个隐患——文件没关闭。虽然Python会在垃圾回收时自动处理,但如果你在循环里抛了异常,文件句柄可能迟迟不释放。所以更稳妥的写法是with open('data.txt') as f: for line in f:,with语句保证无论代码怎么跑,文件都会正常关闭。

读出来的是字符串,带着换行符\n。你要是直接拿去split(','),最后一行末尾那个空字符串会给你捣乱。我习惯先line.strip()把首尾空白清掉,再判断是否为空行——空行跳过,别让数据里混进None。比如处理CSV时,for line in f: line = line.strip(); if not line: continue,这个模式我用了五年,从没出过岔子。

真正麻烦的是数据本身不干净。比如一个日志文件,每行格式是时间,级别,消息,但消息里可能带逗号。这时候split(',')就废了。得用Python的csv模块,它处理引号包裹的字段很专业:

import csv with open('log.csv', newline='', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: print(row[0], row[2]) # 时间,消息

注意newline=''这个参数,不加的话Windows上会多出空行。编码也要显式指定——别指望系统默认编码,Windows的GBK和Linux的UTF-8能坑死你。我吃过亏,文件里全是乱码,最后发现是没加encoding='utf-8'。

文件特别大,比如几个GB的文本,逐行读还是慢。这时候可以调整缓冲区:with open('big.txt', 'r', buffering=1024*1024) as f:,把缓冲区设成1MB,磁盘IO次数减少一半。实测读取速度能提升30%左右。但这招对固态硬盘效果不明显,机械硬盘上立竿见影。

还有种情况——文件是JSON或XML,结构化的。那就别逐行读了,直接json.load(f)整个塞进内存。但如果是JSONL(每行一个JSON对象),还是得逐行处理:

import json with open('data.jsonl', 'r', encoding='utf-8') as f: for line in f: obj = json.loads(line) # 处理obj

这里有个性能技巧:json.loads是纯Python实现,慢。换用orjson库能快5到10倍。如果你的项目允许加依赖,强烈推荐。

最后说个冷门的——文件里可能有二进制内容,比如图片混在文本里。这时候别用文本模式打开,得用'rb'模式读字节,然后自己处理分隔符。但这种情况很少见,真遇到了,建议先确认文件格式是不是搞错了。

遍历文件数据,核心就三件事:搞清楚格式、控制内存、处理异常。格式决定了你怎么解析,内存决定了你能不能一次读完,异常处理决定了你程序崩不崩。把这三点想明白,任何文件都难不倒你。我见过有些新手用readlines()把整个文件读进列表,再遍历——小文件没事,大文件直接内存溢出。记住,能用迭代器的别用列表,能用生成器的别用数组。

写代码这事,多踩几次坑就记住了。下次遇到文件读取问题,先试试with open加for line in f,八成能解决。剩下的两成,查查编码和格式,也就通了。

分享到: