gpt4 book ai didi

Python处理csv文件去除大于3字节的unicode字符

转载 作者:行者123 更新时间:2023-11-28 16:36:35 29 4
gpt4 key购买 nike

我正在使用 Python 2.7.5 并尝试获取现有的 CSV 文件并对其进行处理以删除大于 3 个字节的 unicode 字符。 (将此发送给 Mechanical Turk,这是亚马逊的限制。)

我尝试在这个问题 (How to filter (or replace) unicode characters that would take more than 3 bytes in UTF-8?) 中使用最佳(惊人)答案。我假设我可以逐行遍历 csv,并且无论我发现 >3 字节的 unicode 字符,都将它们替换为替换字符。

# -*- coding: utf-8 -*-
import csv
import re

re_pattern = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)
ifile = open('sourcefile.csv', 'rU')
reader = csv.reader(ifile, dialect=csv.excel_tab)
ofile = open('outputfile.csv', 'wb')
writer = csv.writer(ofile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)

#skip header row
next(reader, None)

for row in reader:
writer.writerow([re_pattern.sub(u'\uFFFD', unicode(c).encode('utf8')) for c in row])

ifile.close()
ofile.close()

我目前遇到这个错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xea in position 264: ordinal not in range(128)

所以这确实正确地遍历了一些行,但是当它到达奇怪的 unicode 字符时停止。

我真的很感激一些指点;我完全糊涂了。我已将 'utf8' 替换为 'latin1' 并将 unicode(c).encode 替换为 unicode(c).decode,但我不断收到同样的错误。

最佳答案

您的输入仍然是编码 数据,而不是 Unicode 值。您需要先解码unicode 值,但您没有指定要使用的编码。然后您需要再次编码回到编码值以写回输出 CSV:

writer.writerow([re_pattern.sub(u'\uFFFD', unicode(c, 'utf8')).encode('utf8')
for c in row])

您的错误源于 unicode(c) 调用;如果没有要使用的显式编解码器,Python 会回退到默认的 ASCII 编解码器。

如果您将文件对象用作上下文管理器,则无需手动关闭它们:

import csv
import re

re_pattern = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)

def limit_to_BMP(value, patt=re_pattern):
return patt.sub(u'\uFFFD', unicode(value, 'utf8')).encode('utf8')

with open('sourcefile.csv', 'rU') as ifile, open('outputfile.csv', 'wb') as ofile:
reader = csv.reader(ifile, dialect=csv.excel_tab)
writer = csv.writer(ofile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
next(reader, None) # header is not added to output file
writer.writerows(map(limit_to_BMP, row) for row in reader)

我也将替换操作移到了一个单独的函数中,并使用生成器表达式为 writer.writerows() 函数按需生成所有行。

关于Python处理csv文件去除大于3字节的unicode字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25362251/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com