【作者结论】
-- > 把文本列中的所有英文逗号替换为中文逗号
-- > 更改文本格式为utf-8 BOM编码
--> 用WPS打开,成功(亲测可行)
1. 如果是码农,建议直接用notepad++查看,简单便捷,省去无数麻烦。
2. 如果是给其他人员看,那么需要借助excel或者WPS:
(1)Excel的缺点:需要先把csv文件从utf-8转码为ANSI,打开后中文才不会乱码,但是这会造成文本本身特殊符号、表情的乱码。因此,不推荐。
(2)WPS的优点:能够直接打开utf8格式的csv文件,无需转码。
二者共同的缺点都是,默认英文逗号为分隔符。这意味着,如果你的文本某一列内部含有英文逗号,用这两个工具打开后会发现一列文本分两列显示,数据极其不整齐。
如何解决:
方案一:管它三七二十一,直接把所有英文逗号统一换成中文逗号,哪怕本文是英文文本。【最推荐】
简单版本如下:
text = dic.get('text ', "").replace(",", ",")
注意英文逗号和中文逗号的区别(其实最终在csv中都显示为英文逗号,但是WPS却偏偏能识别出中文逗号,不按套路出牌的WPS,根本读不懂!!!!)
(插入一个私货,供作者自己使用的复杂版本如下)
def filter_text(text):
text = text.replace("\/", "/")
re_tag = re.compile('?\w+[^>]*>') # HTML标签
new_text = re.sub(re_tag, '', text)
new_text = re.sub(",,,+", ",,,", new_text) # 合并逗号
new_text = re.sub(" +", " ", new_text) # 合并空格
new_text = re.sub("--+", "--", new_text) # 合并-
new_text = re.sub("———+", "———", new_text) # 合并-
return new_text
description = filter_text(d.get('description', "")).replace("\r","\t").replace("\n",".").replace(",", ",")
方案二:给文本加引号,让WPS能识别出这是个统一的文本,如
user_id = dic.get('user_id ', "")
text = dic.get('text ', "").replace(", ", ",").replace("\"", "\'")
注意:
(1)需要把所有的"英文逗号+空格" 替换成 ”英文逗号“,否则WPS仍然认为这个文本内部分列了.别问为什么,我也不知道为什么WPS要做如此微妙的设定。。
(2)需要把文本内部自带的引号,统一替换为单引号。否则WPS仍然会以引号出现的地方作为本列的结尾。那么后续就麻烦了,打开后你面对的仍然是乱七八糟的格式。
即便我做了如此尝试,结果仍然匪夷所思:
WPS中,有的逗号被认为是文本内部,有的逗号被认为是分列符号。
但是,csv源文件中的数据十分规整,一模一样的逗号,没任何毛病。
让人想摔杯子。
最后:
如果WPS打开utf8格式的文件存在乱码,不影响分列的话,可以忍忍。
如果影响分列和整齐性,那么试一下utf8 BOM编码,虽然仍然显示有乱码,但是分列无影响了(说明此乱码非彼乱码)。
如何根本消除乱码呢? 无解。
回到开头,直接用notepad查看csv吧,用什么WPS呢。。