如何在写入CSV时避免Unicode错误?

2 投票
2 回答
2072 浏览
提问于 2025-04-18 08:28

我看到很多关于这个问题的例子,但还没有找到一个简单有效的解决办法。我仍然收到这个错误信息:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xad' in position 5: ordinal not in range(128)

这是我根据在StackOverflow上看到的类似问题整理出来的代码。

f = open(out_filepath, 'w')
  writer = csv.DictWriter(f, fieldnames, extrasaction='ignore')
  headers = dict([(header, header) for header in fieldnames])
  data = [headers]
  data.extend([row for row in rows]) # add data rows
  for row in data:
    try:
        writer.writerow(row)
    except:
        for value in row.itervalues():
            for s in value:
                try:
                    unicode(s).encode("utf-8")
                except:
                    s = ''
        writer.writerow(row)
  f.close() 

这是我尝试过的更新代码,但仍然出现错误:

for row in data:
    try:
        writer.writerow(row)
    except:
        for key in row:
            value = row[key]
            letterlist = list(value)
            for i in range(len(letterlist)):
                try:
                    letterlist[i].decode('string_escape')
                    letterlist[i].encode('ascii', 'ignore')
                except:
                    print 'Letter excluded from ' +key+' '+ str(letterlist) 
                    letterlist[i] = ''
            value = ''.join(letterlist)
            row[key] = value
        #print row
        writer.writerow(row)

2 个回答

1

这是我用过的有效方法:

f = open('eg.csv', 'w')
s = 'some troublesome string'
f.write(s.decode('string_escape')) 

如果这个方法不行,我会尝试:

f.write(s.encode('ascii', 'ignore'))
0

我最后用这个函数把unicode转换成utf8格式。

def ValConvert(val):
  if type(val).__name__ == 'unicode':
    return val.encode('utf8')
  elif type(val).__name__ == 'str':
    return val
  else:
    return str(val)

撰写回答