工业级csv阅读器(python)

工业级csv阅读器(python),python,csv,unicode,Python,Csv,Unicode,以下是我的使用案例:我的工作是清理CSV文件,这些文件通常会从网页上被废弃(大多数是英文的,但一些德语和其他奇怪的非unicode字符会潜入其中)。Python3默认为“utf-8”,通常为 import csv #open file with open('input.csv','r',encoding = 'utf-8') reader = csv.reader(f) 即使到处都是try/catch块,UnicodeEncodeError也会失败 如果连打开都打不开,我想不出如

以下是我的使用案例:我的工作是清理CSV文件,这些文件通常会从网页上被废弃(大多数是英文的,但一些德语和其他奇怪的非unicode字符会潜入其中)。Python3默认为“utf-8”,通常为

import csv

#open file 
with open('input.csv','r',encoding = 'utf-8') 
    reader = csv.reader(f)
即使到处都是try/catch块,UnicodeEncodeError也会失败

如果连打开都打不开,我想不出如何清理输入。我的最终目标只是将每一行读入一个我称之为文本的列表

我没有主意了我甚至试过以下方法:

 for encoding in ('utf-8','latin-1',etc, etc):
     try:
         //open the file 
我不能对编码做任何假设,因为它们可能是在世界另一个地方的unix机器上编写的,而我在windows机器上。输入只是简单的字符串,否则就是示例


测试用例:“这是一个测试用例的示例,当在文本处理器中打开时,测试可能会换行”

可以尝试完全读取内容,然后使用bytes.decode(),方式与您提到的大致相同:

#!python3
import csv
from io import StringIO

with open('input.csv', 'rb') as binfile:
    csv_bytes = binfile.readall()

for enc in ('utf-8', 'utf-16', 'latin1'):
    try:
        csv_string = csv_bytes.decode(encoding=enc, errors='strict')
        break
    except UnicodeError as e:
        last_err = e
else: #none worked
    raise last_err


with StringIO(csv_string) as csvfile:
    csv = csv.reader(csvfile)
    for row in csv:
        print(row[0])

你能用字节来读取它吗?试着用各种方法来解码它?我想是Tadhg,但在Python3中,将csv读取为“wb”会引发另一个错误。我肯定有办法做到这一点我不确定那是什么。你说你试过
latin1
,它可以读取任何东西(如果不是真的
latin1
),而没有“UnicodeDecodeError”,那么你到底从哪里得到错误?实际的、可复制的示例,以及精确的回溯帮助。我猜如果你有“UnicodeEncodeError”的话,
print
真的会出现异常。如果你不能对编码做任何假设,你就有一个更大的问题。也许
chardet
模块能帮上忙。我希望你不介意,我编辑了代码,这样如果所有编码都失败,它就不会出现
namererror