[英]Python process a csv file to remove unicode characters greater than 3 bytes
我正在使用Python 2.7.5並嘗試獲取現有的CSV文件並對其進行處理以刪除大於3個字節的unicode字符。 (發送給機械土耳其人,這是亞馬遜的限制。)
我試過在這個問題中使用頂級(驚人的)答案( 如何過濾(或替換)在UTF-8中占用超過3個字節的unicode字符? )。 我假設我可以逐行迭代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字符時會停止。
我真的很感激一些指示; 我完全糊塗了。 我用'latin1'和unicode(c).encode替換了'utf8'到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()
函數的所有行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.