You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:45:11