Python中CSV写入异常值且无法生成合并CSV的问题求助
问题:CSV合并后写入异常值,控制台输出正常
我编写的Python代码用于读取指定目录下所有CSV文件,对指定列过滤后合并DataFrame并写入新CSV。VS控制台能输出正确的筛选结果,但生成的CSV文件存在异常值,无法得到预期结果。
代码实现
# 替换为你的实际代码 import os import pandas as pd def merge_filtered_csvs(input_dir, output_path, filter_col, filter_val): merged_data = [] for file in os.listdir(input_dir): if file.endswith(".csv"): full_path = os.path.join(input_dir, file) df = pd.read_csv(full_path) # 过滤指定列 filtered = df[df[filter_col] == filter_val] print(filtered) # 控制台输出正确 merged_data.append(filtered) # 合并并写入文件 combined_df = pd.concat(merged_data) combined_df.to_csv(output_path, index=False) # 调用示例 merge_filtered_csvs("./csv_files", "result.csv", "type", "valid")
输入示例(单个CSV内容)
data1.csv
id,type,value 1,valid,100 2,invalid,200 3,valid,150
data2.csv
id,type,value 4,valid,300 5,invalid,250
异常输出情况
说明:控制台输出仅包含type=valid的行,但生成的result.csv中出现NaN值、重复表头或乱码等异常
排查与解决方法
1. 统一列名格式
不同CSV文件的列名可能存在大小写、空格差异(比如Type vs type、type vs type),导致过滤后生成空DataFrame,合并后出现NaN。
解决代码:
df = pd.read_csv(full_path) # 标准化列名:转小写+去除首尾空格 df.columns = [col.strip().lower() for col in df.columns] # 过滤时使用标准化后的列名 filtered = df[df[filter_col.strip().lower()] == filter_val]
2. 处理空DataFrame
若某个CSV过滤后无匹配行,空DataFrame会被加入列表,合并后产生空行或NaN列。
解决代码:
if not filtered.empty: merged_data.append(filtered)
3. 指定写入编码
若CSV含中文或特殊字符,默认编码会导致乱码(表现为异常值)。
解决代码:
combined_df.to_csv(output_path, index=False, encoding="utf-8-sig")
4. 统一列顺序
不同CSV的列顺序不一致时,concat会自动填充NaN。
解决代码:
# 提前定义目标列顺序 target_cols = ["id", "type", "value"] # 读取后强制按目标顺序取列 df = pd.read_csv(full_path)[target_cols] filtered = df[df[filter_col] == filter_val]
5. 确保文件完全覆盖
多次运行代码可能残留旧数据,显式指定写入模式:
combined_df.to_csv(output_path, index=False, mode="w", encoding="utf-8-sig")
内容的提问来源于stack exchange,提问作者Dharmendra
相关产品推荐
相关产品推荐

