Pandas读取CSV文件未读取完整内容 丢失行且无法操作空白单元格
问题根因
两个问题的核心原因都是pandas.read_csv()默认参数和你的无表头CSV结构不匹配:
- 丢行问题:
read_csv默认header=0,会自动把第一行识别为列名,不算入有效数据行。你的CSV全是业务数据、没有专门的表头行,因此第一行yes,yes...被直接当成列名处理,实际读入的数据只有原文件的第2-6行共5行。后续to_csv时你设置了header=False不输出列名,写回的文件自然就少了1行。之前添加nrows=6、skip_blank_lines=False不生效,是因为这两个参数不会修改默认的表头识别逻辑,文件扣除被识别为表头的第一行后只剩5行数据,设再大的nrows也读不满6行。 - 无法写入超范围单元格:读入的DataFrame本身只有5行数据,维度和你预期的6行6列结构不匹配,自然无法给不存在的行/列赋值。另外注意:
iat索引从0开始计数,6行数据的合法行索引范围是0-5,你之前尝试传入索引6本身就属于越界传参,哪怕读取维度正确也会触发报错。
修复方案
- 读取CSV时必须添加
header=None参数,明确告知pandas当前文件没有表头,所有行都是有效数据行。 - 如果需要操作比当前文件内容更大范围的单元格(比如后续要写入第10行、第10列,哪怕当前文件只有6行),读入数据后主动用
reindex把DataFrame扩展到你需要的目标行列数,空缺位置自动填充你需要的默认值(比如你当前场景的默认值是yes)。 - 写回CSV时保持
index=False、header=False参数,避免额外写入行索引或表头内容。
可直接运行的修复代码
import pandas # 按需修改配置项:目标CSV行列数、单元格默认值、文件路径 TARGET_ROWS = 6 TARGET_COLS = 6 DEFAULT_CELL_VALUE = "yes" CSV_PATH = 'path/to/my/script/test.csv' # 读取时指定header=None,不将第一行识别为表头 data = pandas.read_csv(CSV_PATH, header=None, skip_blank_lines=False) # 扩展DataFrame到目标行列数,空缺位置自动填充默认值 data = data.reindex( index=range(TARGET_ROWS), columns=range(TARGET_COLS), fill_value=DEFAULT_CELL_VALUE ) # 正常执行单元格赋值即可,注意iat索引顺序为[行位置, 列位置],从0开始计数 data.iat[1, 1] = 'DataHere' # 只要在TARGET_ROWS、TARGET_COLS范围内的单元格,哪怕原文件不存在对应行/列都可以正常写入 # data.iat[5, 3] = 'TestData' # 对应第6行第4列 # 写回文件,关闭索引和表头输出 data.to_csv(CSV_PATH, index=False, header=False)
效果验证
用你提供的初始6行全yes的CSV运行上述代码后,写回的文件会保持完整6行6列结构,第二行第二列正确写入DataHere,不会出现末尾行丢失的问题。后续如果需要操作更大尺寸的表格,只需要调大TARGET_ROWS和TARGET_COLS的数值即可,不需要手动预填CSV内容,扩展逻辑会自动补全默认值。
内容的提问来源于stack exchange,提问作者SmortVarke
相关产品推荐
相关产品推荐

