使用pd.read_csv读取芝加哥犯罪CSV时部分行数据全存首列的解决方案求助
嘿,我之前碰到过一模一样的CSV解析问题!你说的前置双引号确实是罪魁祸首——pandas默认会把双引号当成字段的包裹符,那些行开头的引号会让pandas误以为整行都是一个字段,直接塞进第一列了。给你几个实用的解决办法,按靠谱程度排序:
1. 直接关闭或修改pandas的引号解析规则
这是最快的解决方式,不用修改原始文件。你可以通过read_csv的参数告诉pandas忽略这些捣乱的引号:
# 方法A:指定一个文件里不存在的字符作为引号标识符,让pandas跳过引号解析 crime_df = pd.read_csv('ChicagoCrime.csv', quote_char='\'') # 方法B:完全关闭引号解析(更彻底) import csv crime_df = pd.read_csv('ChicagoCrime.csv', quoting=csv.QUOTE_NONE)
解释:csv.QUOTE_NONE会让pandas把所有引号都当成普通文本,不会用它来分割字段,这样那些前置双引号就不会干扰列的拆分了。
2. 预处理CSV文件,移除前置双引号
如果第一种方法还有问题,你可以先清理掉所有行开头的双引号,再读取:
import csv # 读取原始文件,清理后写入新文件 with open('ChicagoCrime.csv', 'r', encoding='utf-8') as infile, open('Cleaned_ChicagoCrime.csv', 'w', encoding='utf-8', newline='') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) # 处理表头(如果有的话)和每一行数据 for idx, row in enumerate(reader): if row and row[0].startswith('"'): # 去掉第一个字段开头的双引号 row[0] = row[0].lstrip('"') writer.writerow(row) # 读取清理后的文件 crime_df = pd.read_csv('Cleaned_ChicagoCrime.csv') crime_df.head(10)
解释:这个方法从根源上消除了导致解析错误的因素,适合那些引号格式问题比较固定的场景。
3. 跳过错误行(不推荐,会丢数据)
你提到删除异常行只剩5%的数据,所以这个方法尽量不用,但可以用来快速验证问题:
# 跳过解析失败的行,会丢失大量数据,仅用于排查 crime_df = pd.read_csv('ChicagoCrime.csv', error_bad_lines=False)
解释:这个参数会自动跳过那些无法正确解析的行,但代价是丢失大部分数据,只适合临时确认问题确实出在这些行的格式上。
另外给你个小建议:用VS Code或Notepad++打开原始CSV,仔细看看那些异常行的格式——除了前置双引号,有没有字段内未闭合的引号?如果有的话,可能需要结合escapechar参数来处理,比如指定escapechar='\\'让pandas识别转义的引号。
内容的提问来源于stack exchange,提问作者nleh
相关产品推荐
相关产品推荐

