
本文旨在解决使用pandas `read_csv` 读取csv文件时,因列中存在不平衡引号(如`"(10,12)`)和分隔符后初始空白字符导致的解析失败问题。我们将通过结合正则表达式预处理字符串数据和 `read_csv` 的 `skipinitialspace` 参数,实现对复杂csv数据的健壮性解析,确保混合格式数据能够正确加载到dataframe中。
在使用Pandas的read_csv函数处理复杂CSV文件时,开发者常会遇到一些棘手的解析问题。其中,最常见且难以直接解决的包括:
这些问题尤其容易出现在某一列包含多种数据格式(如整数、布尔值和字符串表示的元组)的CSV文件中。
为了克服上述挑战,我们需要采取组合策略:首先对原始CSV数据进行预处理以修复不平衡的引号,然后配置read_csv以正确处理分隔符后的空白。
针对不平衡的引号问题,一种有效的方法是在文件读取之前,使用正则表达式对文件内容进行字符串替换。我们的目标是识别那些本应被引号包围但却缺少闭引号的模式。
例如,如果遇到"(10,12),这样的模式,很明显在"和(之间缺少了一个闭引号。我们可以寻找 ) 后面紧跟着逗号 , 的情况,并在 ) 之后、逗号之前插入一个双引号 "。
使用的正则表达式模式如下:
通过这种替换,"(10,12), 就会被转换为 "(10,12)",,从而修复了不平衡的引号。
Pandas read_csv 提供了一个参数 skipinitialspace 来专门处理分隔符后的空白。当此参数设置为 True 时,read_csv 会在解析字段时忽略分隔符后的初始空白字符。这对于像 0, 1, "(10,12)", "(20,11)", 9 这样的数据行至关重要,它能确保 "(10,12)" 不会被解析成 " (10,12)"。
下面是一个完整的Python代码示例,演示了如何结合使用正则表达式预处理和 skipinitialspace 参数来健壮地读取包含复杂格式和不平衡引号的CSV文件。
假设我们有一个名为 my_csv.csv 的文件,内容如下:
0, 1, "(10,12), "(20,11)", 9
请注意,"(10,12) 缺少了闭引号。
import io
import re
import pandas as pd
def read_problematic_csv(file_path):
    """
    读取并解析包含不平衡引号和分隔符后空白的CSV文件。
    Args:
        file_path (str): CSV文件的路径。
    Returns:
        pandas.DataFrame: 解析后的DataFrame。
    """
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            # 读取文件内容
            csv_content = f.read()
            # 使用正则表达式修复不平衡的引号
            # 查找 ') ' 或 '),' 并替换为 ')",'
            # 例如: "(10,12), " -> "(10,12)", "
            # 这里我们假设闭括号 ')' 后面应该紧跟一个引号,然后才是逗号
            # 原始问题中的例子是 `"(10,12), "(20,11)"`,修复后应为 `"(10,12)", "(20,11)"`
            # 我们的正则匹配 `)` 后面跟着可选的空白和逗号,并在 `)` 之后、逗号之前插入 `"`
            processed_content = re.sub(r'(\))\s*(,)', r'\1"\2', csv_content)
            # 使用io.StringIO将处理后的字符串内容视为文件对象
            df = pd.read_csv(io.StringIO(processed_content),
                             skipinitialspace=True,  # 忽略分隔符后的初始空白
                             header=None             # 如果CSV没有标题行,则设置为None
                            )
        return df
    except FileNotFoundError:
        print(f"错误: 文件 '{file_path}' 未找到。")
        return pd.DataFrame()
    except Exception as e:
        print(f"读取或解析CSV时发生错误: {e}")
        return pd.DataFrame()
# 示例使用
if __name__ == "__main__":
    # 创建一个模拟的CSV文件
    with open('my_csv.csv', 'w', encoding='utf-8') as f:
        f.write('0, 1, "(10,12), "(20,11)", 9\n')
    df_result = read_problematic_csv('my_csv.csv')
    print("解析后的DataFrame:")
    print(df_result)
    # 清理模拟文件
    import os
    if os.path.exists('my_csv.csv'):
        os.remove('my_csv.csv')代码解析:
运行上述代码,你将得到如下输出:
解析后的DataFrame: 0 1 2 3 4 0 0 1 (10,12) (20,11) 9
可以看到,原本不平衡引号和包含前导空格的字符串 "(10,12) 和 "(20,11)" 都被正确地解析为DataFrame的单元格内容,并且前导空格也被正确处理。
注意事项:
通过结合文件预处理和Pandas的灵活配置,我们可以有效地解决CSV数据中常见的解析难题,确保数据能够准确、完整地加载到Pandas DataFrame中进行后续分析。
以上就是解决Pandas read_csv 处理不平衡引号与初始空白问题的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号