【pandas】read_csv时数据行数减少或报错

1.背景

linux中wc -l统计文件行数224053,通过pandas中的read_csv方法读取该文件并to_excel时总是显示读取到的df行数187335。

或者报错:
在这里插入图片描述

2.原因

两者都可能是文件中包含特殊字符"造成的。行数减少可能是"匹配时把其它的行误当作引号中的内容,解析成了一个字段。报错可能是因为文件中"数量不成对匹配。

3.验证

map@gzdt-map-poi-yingxiang-offline04 extract_data$ cat -n 0716_v2_noteq | grep '"'
 24453	15409246384565034859	红河哈尼族彝族自治州	红河哈尼族族自治州	"[<EOS>] 云南省[PROV] 红河哈尼族族自治州[CITY] 弥勒市[DISTRICT] 弥阳镇[TOWN] 湖泉尚景[POI] 二期[AREA_SUBPOI] A-17号"[REDUNDANT]
 38188	14961161276348602541	福州市	福建师范大学	大[<EOS>] 学城[PROV] 福建师范大学[PROV] 新校区[POI] 生活区[VAGUE_SUBPOI] A区餐厅[VAGUE_SUBPOI] 一层[FLOORNO] "[REDUNDANT] 福建师范大学[POI] "[REDUNDANT] ([<EOS>] 花香园美食餐厅[INNER_SUBPOI] )[<EOS>]
 38189	7960444309562608918	福州市	福建师范大学	大[<EOS>] 学城[PROV] 福建师范大学[PROV] 新校区[POI] 生活区[VAGUE_SUBPOI] A区餐厅[VAGUE_SUBPOI] 一层[FLOORNO] "[REDUNDANT] 福建师范大学[POI] "[REDUNDANT] ([<EOS>] 花香园美食餐厅[INNER_SUBPOI] )[<EOS>]
 83261	17166354574871997265	南宁市	/[REDUNDANT] 南宁市	"[REDUNDANT] 广西壮族自治区[PROV] /[REDUNDANT] 南宁市[CITY] /[REDUNDANT] 青秀区[DISTRICT] /[REDUNDANT] 建政街道[TOWN] 东葛路[ROAD] 青秀万达金座[POI] 东[ASSIST] 8栋[HOUSENO] 140号[ROOMNO]
119979	8977372240347184596	台州市	临海市	"[REDUNDANT] 浙江省[PROV] 临海市[CITY] 杜桥镇[TOWN] 站东路[ROAD] 15[ROADNO] 二楼[FLOORNO]

共有5行数据包含"字符,其中83261行和119979行中都只包含一个,所以导致83261行和119979行中的引号匹配。read_csv方法在解析文件时,默认会将双引号内的内容当作一个整体,因此83261行引号之后到119979整行数据,都会被解析成83261行的一个字段,这中间的数据行也就都丢失了。

丢失的行数119979-83261=36718和上面的224053-187335=36718也一致。

data[data['bid'] == '17166354574871997265']查看下to_csv读取的df中bid为17166354574871997265的数据:


[ROAD] 黎平县[DISTRICT] 城关第一小学[POI] 西侧[ASSIST] 约110米[DISTANCE]\n8648489975225303206\t黔东南苗族侗族自治州\t苗族侗族自治州\t黔东南[PROV] 苗族侗族自治州[CITY] 黎平县[DISTRICT] 平街[ROAD] 黎平县[DISTRICT] 城关第一小学[POI] 西侧[ASSIST] 约110米[DISTANCE]\n18073465080883625594\t黔东南苗族侗族自治州\t苗族侗族自治州\t黔东南[PROV] 苗族侗族自治州[CITY] 黎平县[DISTRICT] 府前路[ROAD] 黎平县[DISTRICT] 城关第一小学[POI] 西侧[ASSIST] 约180米[DISTANCE]\n13376777474726333404\t黔西南布依族苗族自治州\t兴义市\t黔西南[PROV] 兴义市[CITY] 顶效经济开发区[DEVZONE] 开发东路[ROAD] 顶兴小学[POI] 对面[ASSIST]\n8977372240347184596\t台州市\t临海市\t[REDUNDANT] 浙江省[PROV] 临海市[CITY] 杜桥镇[TOWN] 站东路[ROAD] 15号[ROADNO] 二楼[FLOORNO]

4.解决

1)通过修改read_csv(https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#)方法中的参数quoting=3,该参数的含义是忽略文本字段中的所有引号,但是也可能会带来一个问题,就是引号中如果包含特殊字符比如分隔符,就会导致解析的字段变多引发异常。

2)手动处理,通过awk '{if(gsub(/"/,"&")%2!=0) print $0}' 0716_v2_noteq找到那些引号不成对匹配的记录,手动添加。

awk 'BEGIN{FS="\t"}{if(gsub(/"/,"&")%2!=0) $4=$4"\""}{print $0}' 0716_v2_noteq > new_file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值