为何CSV文件转二维数组正常,TXT文件转二维数组却触发列表越界错误?
为什么读取TXT转二维数组会报索引越界,而CSV代码正常?
先看两段代码的表现:
报错的TXT读取代码
def read_text_file(filename): with open(filename, 'r') as file: array = [line.split() for line in file] return array array = read_text_file("file.txt") print(array[0][1])
这段代码运行时会抛出list index out of range错误。
正常运行的CSV读取代码
import csv with open('file.csv', 'r') as file: reader = csv.reader(file) data = list(reader) print(data[0][1])
两者的核心差异在于数据分割的逻辑和格式处理规则,具体分三点:
1. 分割规则的严格性不同
- TXT代码用
line.split():默认按任意空白字符(空格、制表符、换行符等)分割,还会自动忽略行首/行尾的空白。如果file.txt第一行只有1个元素(比如abc),或是空行,那么array[0]就是长度为1的列表['abc'],甚至是空列表[],这时访问索引1必然越界。 - CSV的
csv.reader:严格遵循CSV格式标准,默认用逗号作为分隔符,哪怕字段是空值(比如第一行是a,,b),也会保留空字符串的位置,生成['a', '', 'b']这样的列表,确保每行的子列表长度和列数匹配,不会出现索引突然缺失的情况。
2. 空行的处理方式不同
- TXT代码遇到空行时,
line.split()会返回空列表[],如果file.txt的第一行是空行,array[0]就是空列表,访问[1]直接触发索引越界。 csv.reader遇到空行时,会生成一个包含空字符串的列表[''],不会出现空列表,所以data[0]至少有一个元素,只要CSV文件的第一行确实有两个及以上字段,访问[1]就不会报错。
3. 复杂字段的兼容性不同
如果数据里有带空格的字段(比如"hello world",123),TXT代码的split()会把它拆成['"hello', 'world"', '123'],破坏字段完整性;而csv.reader会正确识别引号包裹的字段,生成['hello world', '123'],保证每个字段的位置和内容正确,自然不会出现索引错位的问题。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

