SyntaxError:非ASCII字符' \ xfe'发生文件错误

时间:2017-03-07 02:11:52

标签: python csv python-2.x

SyntaxError:非ASCII字符' \ xfe'发生文件错误。  我想读取tsv文件,并更改为csv文件。当我运行此应用程序时,会发生此错误。 我写了

# coding: shift_jis

import libraries as libraries
import DataCleaning
import csv


media = 'Google'
tsv = csv.reader(file(r"data/aaa.csv"), delimiter = '\t',encoding='UTF-16')

for row in tsv:
  print ", ".join(row)

我认为ASCII是错误的,但我不知道如何解决这个问题。 我的tsv文件是shift_jis,最后我想把它改成UTF-8。但我认为这个错误发生是因为我没有将编码指定为UTF-16。

1 个答案:

答案 0 :(得分:0)

Python 2上的csv模块不支持Unicode。您不能将encoding作为参数传递给它,它不是可识别的参数(只有csv格式参数被接受为关键字参数)。它无法正确使用Py2 unicode类型,因此使用它涉及以二进制模式读取,即使这样,只有当换行符为每个字符一个字节时,它才能正常工作。每the csv module docs

  

注意:此版本的csv模块不支持Unicode输入。此外,目前有一些关于ASCII NUL字符的问题。因此,所有输入应为UTF-8或可打印的ASCII以确保安全;请参阅示例部分中的示例。

如果可能的话,切换到Python 3,其中csv模块默认使用Py3的Unicode友好str,绕过Python 2的csv模块中的所有问题,并且encoding可以正确传递给open。在这种情况下,您的代码简化为:

with open(r"data/aaa.csv", encoding='utf-16', newline='') as inf:
    tsv = csv.reader(inf, delimiter='\t')
    # Explicit encoding argument may be needed for TextIOWrapper;
    # the rewrapping is done to ensure newline='' is used as the csv module requires
    csv.writer(io.TextIOWrapper(sys.stdout.buffer, newline='')).writerows(tsv)

或者将CSV写为UTF-8编码文件:

with open(r"data/aaa.csv", encoding='utf-16', newline='') as inf, open(outfilename, "w", encoding='utf-8', newline='') as outf:
    tsv = csv.reader(inf, delimiter='\t')
    csv.writer(outf).writerows(tsv)

如果不这样做,请查看the unicodecsv module on PyPI,它应该在Python 2上正确处理Unicode输入。