1

我正在尝试写入文件,但出现以下错误:

Traceback (most recent call last):
  File "/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/merge-395780681.888.py", line 151, in <module>
    gc_all_d.writerow(row)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 148, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0329' in position 5: ordinal not in range(128)

在我尝试将咨询师数据库中的一行写入汇总他们姓名的文件后,就会出现错误:

# compile master spreadsheet
with(open('gc_all.txt_3','w')) as gc_all:
    gc_all_d = csv.DictWriter(gc_all,  fieldnames = fieldnames, extrasaction='ignore', delimiter = '\t') 
    gc_all_d.writeheader()
    for row in aicep_l:
        print row['name']
        gc_all_d.writerow(row)
    for row in nbcc_l:
        gc_all_d.writerow(row)
        print row['name']

我在这陌生的水域。我在 writerow() 方法中没有看到可以将编码范围扩大到这个字符 '\u0329' 的参数。

我认为该错误可能与我使用名称解析器模块将所有辅导员的姓名组织成相同格式的事实有关。从 nameparser 导入的 HumanName 函数可能会写出带有前导 'u' 的辅导员姓名以表示 unicode,这意味着无法识别总输出 u'Sam the Man' 而不是 'Sam the Man'。

谢谢您的帮助!


根据答案修改后的错误:

  File "/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/merge-395782963.700.py", line 153, in <module>
    row['name'] = row['name'].encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 11: ordinal not in range(128)

使所有名称条目统一的代码:

# nbcc
with(open('/Users/samuelfinegold/Documents/noodle/gc/nbcc/nbcc_output.txt', 'rU')) as nbcc:
    nbcc_d = csv.DictReader(nbcc, delimiter = '\t')
    nbcc_l = []
    for row in nbcc_d:
#         name = HumanName(row['name'])
#         row['name'] = name.title + ' ' + name.first + ' ' + name.middle + ' ' + name.last + ' ' + name.suffix       
        row['phone'] = row['phone'].translate(None, whitespace + punctuation)
        nbcc_l.append(row)

修改后的代码:

# compile master spreadsheet
with(open('gc_all.txt_3','w')) as gc_all:
    gc_all_d = csv.DictWriter(gc_all,  fieldnames = fieldnames, extrasaction='ignore', delimiter = '\t') 
    gc_all_d.writeheader()
    for row in nbcc_l:
        row['name'] = row['name'].encode('utf-8')
        gc_all_d.writerow(row)

错误:

Traceback (most recent call last):
  File "/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/merge-395784700.086.py", line 153, in <module>
    row['name'] = row['name'].encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 11: ordinal not in range(128)
logout
4

2 回答 2

4

文档

此版本的 csv 模块不支持 Unicode 输入。此外,目前还有一些关于 ASCII NUL 字符的问题。因此,为了安全起见,所有输入都应该是 UTF-8 或可打印的 ASCII;请参阅示例部分中的示例。

您需要在编写数据之前对其进行编码 - 例如:

for row in aicep_1:
    print row['name']
    for key, value in row.iteritems():
        row[key] = value.encode('utf-8')
    gc_all_d.writerow(row)

或者,由于您使用的是 2.7,您可以使用字典理解:

for row in aicep_1:
    print row['name']
    row = {key, value.encode('utf-8') for key, value in row.iteritems()}

或者在文档的示例页面上使用一些更复杂的模式。

于 2013-07-17T19:28:51.657 回答
2

你所拥有的是一个输出流(你的gc_all.txt_3文件,在线打开with,流实例在变量中gc_all),Python 认为它必须只包含 ASCII。您已要求它编写一个带有 Unicode 字符 '\u0329' 的 Unicode 字符串。例如:

>>> s = u"foo\u0329bar"
>>> with open('/tmp/unicode.txt', 'w') as stream: stream.write(s)
...

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0329' in position 3:
ordinal not in range(128)

您有很多选择,包括.encode对每个字符串进行显式处理。codecs.open或者,您可以按照http://docs.python.org/2/howto/unicode.html中的说明打开文件(我假设 Python 2.x,3.x 有点不同):

>>> import codecs
>>> with codecs.open('/tmp/unicode.txt', 'w', encoding='utf-8') as stream:
...     stream.write(s)
... 
>>> 

编辑添加:根据@Peter DeGlopper 的回答,显式encode可能更安全。UTF-8 在其编码中没有 NUL,因此假设您想要 UTF-8,通常是这样,这可能没问题。

于 2013-07-17T19:36:05.463 回答