如何用Python读取多编码CSV并自动跳过前8行说明内容?
解决CSV文件跨编码说明行与数据行的自动读取问题
问题核心
你的CSV文件前8行是utf-8编码的说明内容,第9行是空行,实际数据从第10行开始且采用cp1252编码,直接用单一编码读取会导致乱码,手动删行无法适配动态更新的文件。
方案一:直接指定编码与跳过行数(简单高效)
如果头部说明用cp1252读取不会导致行计数错误(绝大多数场景下都适用),直接利用pandas的skiprows参数跳过前9行,同时指定数据部分的编码为cp1252:
import pandas as pd import os current_path = os.getcwd() print(current_path) # 跳过前9行(8行说明+1行空行),用cp1252编码读取数据 data = pd.read_csv( 'Events.csv', encoding='cp1252', skiprows=9, # 从第10行开始读取数据 header=None, # 数据行无表头 names=range(20) # 匹配你需要的列数 )
方案二:分编码读取(极端场景兜底)
若头部说明包含cp1252无法解析的特殊字符,导致行分割异常,可通过二进制读取拆分文件后分别解码:
import pandas as pd import os from io import StringIO current_path = os.getcwd() print(current_path) file_path = 'Events.csv' # 二进制读取整个文件,避免编码冲突 with open(file_path, 'rb') as f: content = f.read() # 按换行符拆分二进制内容,提取第9行之后的数据段 binary_lines = content.split(b'\n') data_binary = b'\n'.join(binary_lines[9:]) # 将数据段用cp1252解码为字符串,再传入pandas读取 data_str = data_binary.decode('cp1252') data = pd.read_csv( StringIO(data_str), header=None, names=range(20) )
错误原因说明
你之前的代码用utf-8编码读取整个文件,而数据部分实际是cp1252编码,导致数据行解析乱码,出现s和大量NaN;同时未跳过前9行,说明行被当作数据行处理,进一步引发列数不匹配问题。
内容的提问来源于stack exchange,提问作者Michelle Bogush
相关产品推荐
相关产品推荐

