在实际数据处理的场景中,很多CSV文件并非纯粹的结构化数据,可能会在文件开头、结尾或者行内存在冗余的说明文本、空行、注释内容等,直接使用Pandas的read_csv方法读取时会出现解析错误或者数据异常的情况,需要针对性地进行清理后再读取。

常见冗余文本场景分类
首先需要明确CSV文件中冗余文本的常见存在形式,才能针对性选择处理方式,常见的场景主要有以下几类:
- 文件开头存在多行无关说明文本,之后才是表头和数据行
- 文件结尾存在多行总结性或者注释类文本
- 数据行内部存在不符合CSV格式的特殊字符或者多余空格
- 文件存在大量空行,分散在表头和数据行之间
读取前跳过开头冗余文本
如果冗余文本集中在文件开头,且行数固定,可以直接使用skiprows参数跳过指定行数。假设CSV文件前3行是无用的说明文本,第4行才是表头,示例代码如下:
import pandas as pd
# 跳过前3行冗余文本,第4行作为表头
df = pd.read_csv("data.csv", skiprows=3)
print(df.head())
如果冗余文本的行数不固定,但是存在固定的标识字符,比如所有冗余行都以#开头,可以使用comment参数指定注释字符,Pandas会自动跳过所有以该字符开头的行:
import pandas as pd
# 跳过所有以#开头的冗余行
df = pd.read_csv("data.csv", comment="#")
print(df.head())
处理结尾冗余文本
对于文件结尾的冗余文本,可以先读取所有行,再筛选有效数据行。可以通过判断每行的列数是否符合预期来过滤无效行,示例代码如下:
import pandas as pd
# 先读取所有行,不设置表头
with open("data.csv", "r", encoding="utf-8") as f:
lines = f.readlines()
# 假设有效数据每行有5列,过滤列数不符合的行
valid_lines = []
for line in lines:
# 去掉换行符后分割
parts = line.strip().split(",")
if len(parts) == 5:
valid_lines.append(line)
# 将有效行转为字符串流再读取
from io import StringIO
df = pd.read_csv(StringIO("".join(valid_lines)))
print(df.head())
清理行内冗余文本
如果冗余文本存在于数据行的字段内部,比如字段两端有多余空格、特殊符号,可以在读取后使用Pandas的字符串处理方法进行清理,示例代码如下:
import pandas as pd
# 读取CSV文件
df = pd.read_csv("data.csv", skiprows=2)
# 去除所有字符串类型字段两端的空格
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
# 去除字段中的特殊符号,比如多余的*
df = df.replace(r"*", "", regex=True)
print(df.head())
完整处理流程示例
结合上述几种场景,下面是一个完整的处理包含多种冗余文本的CSV文件的示例:
import pandas as pd
from io import StringIO
def clean_csv(file_path):
with open(file_path, "r", encoding="utf-8") as f:
lines = f.readlines()
valid_lines = []
for line in lines:
# 跳过以#开头的行和空行
if line.strip().startswith("#") or not line.strip():
continue
# 过滤列数不符合的行,假设有效数据有4列
if len(line.strip().split(",")) == 4:
valid_lines.append(line)
# 读取有效数据,第一行作为表头
df = pd.read_csv(StringIO("".join(valid_lines)), header=0)
# 清理字段内冗余空格
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
return df
if __name__ == "__main__":
result_df = clean_csv("test.csv")
print(result_df)
print(result_df.info())
注意事项
在处理CSV文件时,需要注意文件的编码格式,如果读取时出现乱码,可以尝试指定encoding参数为gbk或者utf-8-sig。另外如果CSV文件的分割符不是逗号,需要通过sep参数指定对应的分隔符,避免解析错误。