簡體   English   中英

Python處理csv文件以刪除大於3個字節的unicode字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM