我有一个CSV文件,我通过HTML表单上传到Python API
API如下所示:
@app.route('/add_candidates_to_db', methods=['GET','POST'])
def add_candidates():
file = request.files['csv_file']
x = io.StringIO(file.read().decode('UTF8'), newline=None)
csv_input = csv.reader(x)
for row in csv_input:
print(row)
我找到了导致问题的文件部分。在我的文件中,它有Í
个字符。
我收到此错误:UnicodeDecodeError: 'utf8' codec can't decode byte 0xea in position 1317: invalid continuation byte
我以为我是用.decode('UTF8')
解码它,或者是file.read()
之前发生的错误?
我该如何解决这个问题?
** **
编辑:我控制了文件。我通过拉取数据自己创建CSV文件(有时这些数据有奇怪的字符)。
在服务器端,我正在读取文件中的每一行并插入数据库。
答案 0 :(得分:2)
您的数据不是UTF-8,它包含错误。您说您正在生成数据,因此理想的解决方案是生成更好的数据。
不幸的是,有时我们无法获得高质量的数据,或者我们的服务器会给我们带来垃圾,我们必须将其整理出来。对于这些情况,我们可以在解码文本时使用不太严格的错误处理。
而不是:
file.read().decode('UTF8')
您可以使用:
file.read().decode('UTF8', 'replace')
这样可以使任何“垃圾”字符(任何未正确编码为UTF-8的字符)都被U + FFFD取代,如下所示:
您说您的文件具有Í
字符,但您可能正在使用UTF-8以外的编码查看该文件。您的文件是否应该包含Í
,还是只是mojibake?也许你可以弄清楚角色应该是什么,从中你可以弄清楚你的数据使用的编码是不是UTF-8。
答案 1 :(得分:-1)
您的文件似乎未在utf8中编码。您可以尝试使用all the encodings that Python understand读取文件并检查哪个文件可以读取文件的全部内容。试试这个脚本:
from codecs import open
encodings = [
"ascii",
"big5",
"big5hkscs",
"cp037",
"cp424",
"cp437",
"cp500",
"cp720",
"cp737",
"cp775",
"cp850",
"cp852",
"cp855",
"cp856",
"cp857",
"cp858",
"cp860",
"cp861",
"cp862",
"cp863",
"cp864",
"cp865",
"cp866",
"cp869",
"cp874",
"cp875",
"cp932",
"cp949",
"cp950",
"cp1006",
"cp1026",
"cp1140",
"cp1250",
"cp1251",
"cp1252",
"cp1253",
"cp1254",
"cp1255",
"cp1256",
"cp1257",
"cp1258",
"euc_jp",
"euc_jis_2004",
"euc_jisx0213",
"euc_kr",
"gb2312",
"gbk",
"gb18030",
"hz",
"iso2022_jp",
"iso2022_jp_1",
"iso2022_jp_2",
"iso2022_jp_2004",
"iso2022_jp_3",
"iso2022_jp_ext",
"iso2022_kr",
"latin_1",
"iso8859_2",
"iso8859_3",
"iso8859_4",
"iso8859_5",
"iso8859_6",
"iso8859_7",
"iso8859_8",
"iso8859_9",
"iso8859_10",
"iso8859_13",
"iso8859_14",
"iso8859_15",
"iso8859_16",
"johab",
"koi8_r",
"koi8_u",
"mac_cyrillic",
"mac_greek",
"mac_iceland",
"mac_latin2",
"mac_roman",
"mac_turkish",
"ptcp154",
"shift_jis",
"shift_jis_2004",
"shift_jisx0213",
"utf_32",
"utf_32_be",
"utf_32_le",
"utf_16",
"utf_16_be",
"utf_16_le",
"utf_7",
"utf_8",
"utf_8_sig",
]
for encoding in encodings:
try:
with open(file, encoding=encoding) as f:
f.read()
print('Seemingly working encoding: {}'.format(encoding))
except:
pass
其中file
再次是文件的文件名。