【发布时间】:2014-06-17 05:52:40
【问题描述】:
我有一个包含 unicode 字符的大型 csv 文件,这些字符会导致我尝试运行的 Python 脚本出错。到目前为止,我删除它们的过程非常乏味。我运行我的脚本,一旦它遇到一个 unicode 字符,我就会收到一个错误:
'ascii' codec can't encode character u'\xef' in position 197: ordinal not in range(128)
然后我用谷歌搜索 u'\xef' 并试图找出这个字符实际上是什么(有谁知道有这些定义列表的网站吗?)。我正在使用这些信息来构建字典,并且我有第二个 Python 脚本,可以将 unicode 字符转换为常规文本:
unicode_dict = {"\xb0":"deg", "\xa0":" ", "\xbd":"1/2", "\xbc":"1/4", "\xb2":"^2", "\xbe":"3/4"}
for f in glob.glob(r"C:\Folder1\*.csv"):
in_csv = f
out_csv = f.replace(".csv", "_2.csv")
write_f=open(out_csv, "wb")
writer = csv.writer(write_f)
with open(in_csv,'rb') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
new_row = []
for s in row:
for k, v in unicode_dict.iteritems():
s = s.replace(k, v)
new_row.append(s)
writer.writerow(new_row)
write_f.close()
os.remove(in_csv)
os.rename(out_csv, in_csv)
然后我必须再次运行代码,出现另一个错误,然后在 Google 上查找下一个 unicode 字符。一定有更好的办法吧?
【问题讨论】:
-
如果这是 Python 2 而不是 Python 3,那么您的字符可能不是 Unicode,而是 Windows-1252 或 ISO 8859-1。
-
@Mark:这就是 OP 对它们的解释方式。由于我们没有看到他是如何决定原始文本中的“\xbd=1/2”的,因此它可能完全是其他东西——即西里尔文、希腊文、希伯来文或任何其他可能的 8 位代码页。
-
@Jongware,我只能假设这些字符在数据上下文中是有意义的,否则这将是一个完全不同的问题。
标签: python csv dictionary unicode