【问题标题】:How can I write to a CSV without getting a Unicode Error?如何在不出现 Unicode 错误的情况下写入 CSV?
【发布时间】:2023-04-04 08:54:01
【问题描述】:

我已经看到了很多有关此问题的示例,但还没有找到适合我的简单解决方案。我仍然收到错误:

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)

【问题讨论】:

  • 即latin-1编码u'\xad'.encode("latin-1")
  • 如果是 latin-1 编码,我该如何修复我所拥有的,以免出现错误?
  • 试试writer.writerow([s.encode("utf-8") for s in row]),你的数据是unicode吗?
  • 我仍然收到 UnicodeEncodeError。
  • 您的实际数据是什么样的。我可以使用上面的代码将 u'\xad' 写入文件

标签: python csv unicode


【解决方案1】:

这对我有用:

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

如果这不起作用,我会这样做:

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

【讨论】:

  • 你在尝试writer.writerow(row.decode('string_escape'))writer.writerow(row..encode('ascii', 'ignore')) 吗?
  • 我试过了,但遇到了错误。我编辑了我的帖子,向您展示我到目前为止所拥有的内容。
  • 在你写的时候尝试解码/编码,比如writer.writerow(row.decode('string_escape'))
【解决方案2】:

我最终使用这个函数将 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)

【讨论】:

    猜你喜欢
    • 2016-04-15
    • 2017-05-20
    • 2018-04-02
    • 2015-09-28
    • 1970-01-01
    • 2021-12-28
    • 2021-10-30
    • 2015-12-22
    • 2020-12-09
    相关资源
    最近更新 更多