Python中打开的文件有数据但返回长度为0的问题排查
问题:CSV文件检测分隔符后,后续读取返回空内容
我肯定忽略了某个简单的点,但已经困扰我一段时间了,不清楚错误出在哪里。我尝试读取一个CSV文件的数据,先检测分隔符,代码如下:
import csv with open(filepath, 'r') as csvfile: dialect = csv.Sniffer().sniff(csvfile.read()) delimiter = repr(dialect.delimiter)[1:-1] csvdata = [line.split(delimiter) for line in csvfile.readlines()]
但csvfile被读取为长度0。执行:
print(sum(1 for line in csvfile))
结果是0。而执行:
print(sum(1 for line in open(filepath, 'r')))
则得到预期的5行。我已通过更换csvfile变量名排查命名冲突,但结果未变。请问我遗漏了哪一步?
嘿,这个问题其实是文件对象的位置指针在搞鬼!
当你调用csvfile.read()的时候,Python会把文件里的所有内容一次性读出来,同时把文件内部的位置指针移到了文件的末尾。这时候你再去调用csvfile.readlines()或者迭代csvfile,都是从这个末尾位置开始读取,自然就没有内容了,返回空列表或者0行。
解决方法很简单,只需要在第一次读取后,把指针移回文件开头就行,用csvfile.seek(0)方法:
修改后的代码(基础版)
import csv with open(filepath, 'r') as csvfile: # 读取全部内容用于检测分隔符 file_content = csvfile.read() dialect = csv.Sniffer().sniff(file_content) delimiter = repr(dialect.delimiter)[1:-1] # 将文件指针重置到开头 csvfile.seek(0) # 现在可以正常读取所有行 csvdata = [line.split(delimiter) for line in csvfile.readlines()]
更规范的CSV读取方式(推荐)
其实你完全不用自己手动split行,直接用csv模块的reader对象,它会自动用检测到的方言处理分隔符,更可靠:
import csv with open(filepath, 'r') as csvfile: dialect = csv.Sniffer().sniff(csvfile.read()) csvfile.seek(0) # 使用检测到的方言创建reader csv_reader = csv.reader(csvfile, dialect=dialect) # 转换为列表获取所有数据 csvdata = list(csv_reader)
这样处理后,你就能正常获取到文件里的所有行数据啦。
内容的提问来源于stack exchange,提问作者qwertytam
相关产品推荐
相关产品推荐

