爬虫采集到的数据保存到CSV文件中乱码问题的解决办法

         以下的几种错误就是我在解决CSV文件中乱码问题时遇到的:

  • TypeError: write() argument must be str, not bytes;

  • TypeError: a bytes-like object is required, not 'str';

         还有一些是调试的时候出的错误,但是有点忘了,大意就是在用某种方法解决一个错误时引发的下一个错误,主要原因还是没找到根本原因,因此错误不断。

由于我用的的是python3,windows系统,乱码前文件读写操作是这样写的:

with open('文件路径.csv', 'a+', encoding='utf-8', errors='ignore', newline="") as f:
      writer = csv.writer(f)
      writer.writerow(csvHeader)  # 这个是写CSV文件的文件头
      writer.writerow(infoList)   # 这个是将数据按行写到文件中

        一般情况下这样写是没有问题,因为之前这样写拿到的csv文件也是没有乱码的,但这次由于爬取的数据量较大,前面还不会乱码,到了一定数量之后出现了乱码;经过多方查找原因最后是这样解决的:

with open('路径.csv', 'ab+') as fileopen:
     fileopen.write(codecs.BOM_UTF8)   # 为了防止在windows下直接打开csv文件出现乱码

with open('./东方药品网药品信息/国产药物信息表.csv', 'a+', encoding='utf-8', errors='ignore', newline="") as f:
      writer = csv.writer(f)
      writer.writerow(csvHeader)
      writer.writerow(infoList)

          网上搜索解决办法时都没有说清楚,我边看边理解最后中遇弄明白了:

           如果我们使用 Linux/Unix 生成CSV文件,按原来的方式写不会出现乱码问题,想要在Windows上面打开并且不乱码,我们就要显试的写入那几个确认编码的字符:fileopen.write(codecs.BOM_UTF8);但是这句话在python2和python3的写法上有区别,python2种可以直接这么写:

with open('路径.csv', 'ab+') as f:
      f.write(codecs.BOM_UTF8)
      writer = csv.writer(f)
      writer.writerow(csvHeader)
      writer.writerow(infoList)

         但是要注意必须用二进制的方式打开文件,并且open()里没有这些参数 ” encoding='utf-8', errors='ignore', newline="" “;python3这么写的话就会报上面的这些错误,因为 fileopen.write(codecs.BOM_UTF8) 这个必须在二进制打开文件的时候才可用,而python3在使用二进制打开文件并且在执行writer.writerow()写入数据时必须写二进制数据,这就与我们拿到的文本数据数据不符,如果把每个字段都改成二进制的话非常麻烦,所以这里就采用了将文件分两次打开的方式,第一次改形式防止乱码(注意用二进制的方式),第二次写数据(注意用非二进制方式),这样就解决了。

        注意!!!!:当使用两次打开文件的方式时注意一定都用追加的方式打开,我就是以为第一次打开文件只是改格式用”wb“就够了,结果导致我拿到的几万条数据全部被抹掉了,欲哭无泪啊,同志们要注意啊,记得备份!!!!

猜你喜欢

转载自blog.csdn.net/Coding___Man/article/details/86552737