<p>这是一个编码问题。输入csv文件并不像Python平台预期的那样编码为utf-8。问题是,如果不知道它的编码,也没有一个有问题的行的例子,我真的猜不到编码。在</p>
<p><code>encoding='utf8'</code>和<code>encoding='ascii'</code>都断开是正常的,因为有问题的字符是0xa2,它不在ascii范围内(<;=0x7f)不是有效的utf-8字符。但奇怪的是,<code>encoding='latin1'</code>在同一个地方给出了相同的错误,因为0xa2在拉丁语中是<code>¢</code>。在</p>
<p>IMHO,根据<a href="https://stackoverflow.com/a/20194266/3545273">this other SO post</a>,您可以尝试<code>encoding='windows-1252'</code>,如果您的平台支持它。在</p>
<p>如果仍然不起作用,您应该尝试识别<code>latin1</code>的有问题的行:</p>
<pre><code>class special_opener:
def __init__(self, filename, encoding):
self.fd = open(filename, 'rb')
self.encoding = encoding
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
return False
def __next__(self):
line = next(self.fd)
try:
return line.decode(self.encoding).strip('\r\n') + '\n'
except Exception as e:
print("Offending line : ", line, file = sys.stderr)
raise e
def __iter__(self):
return self
def deleteRow(in_fnam, out_fnam):
input = special_opener(in_fnam, 'latin1')
output = open(out_fnam, 'w')
writer = csv.writer(output)
for row in csv.reader(input):
if any(row):
writer.writerow(row)
input.close()
output.close()
</code></pre>
<p><code>special_opener</code>应该输出如下内容:</p>
^{pr2}$
<p>(这行是有效的拉丁语,我是用<code>special_opener(file, 'utf8')</code>得到的)</p>
<p>那你就可以在这里贴出冒犯的字眼了</p>