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