由 CSV 模块触发的"UnicodeEncodeError: 'charmap' codec can't encode characters"



我刚刚开始了一项新工作,我们在Mac上开发,但是我们的服务器是Windows服务器。 所以我在那里迁移了我的新代码(在 Mac 上运行良好),突然我得到了这个回溯:

Traceback (most recent call last):
  File ".jira_oauth.py", line 260, in <module>
    writer.writerow(fields)
  File "C:Anaconda3libcsv.py", line 153, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "C:Anaconda3libencodingscp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1368-1369: character maps to <undefined>

我将在我的代码中发布导致它的行:

for cycle in range(pulls):
        # for cycle in range(pulls):
            logging.info('On cycle: {}'.format(cycle))
            data_url = DATA_URL + mk_data_endpoint(max_res, start_at)
            logging.info('Max Results: {} - Starting Point: {}'.format(
                max_res, start_at
            ))
            # Pull down data and transform into dictionary
            data = json.loads(o.get_data(data_url).decode('utf-8'))
            for issue in data['issues']:
                fields = issue['fields']
                fields['id'] = issue['id']
                fields['key'] = issue['key']
                clean_data(fields)
                split_entries(fields, 'project', 'project_key', 'project_name')
                fields_keys = list(fields.keys())
                for key in fields_keys:
                    if key in lookup.keys():
                        info = lookup.get(key)
                        val = fields.pop(key)
                        # The lookup table is a dictionary with the column
                        # names that come out of Jira as the key, and a tuple
                        # containing the corresponding column name in the
                        # first position, and optional nested levels that
                        # must be traversed to return the value we are looking
                        # for.
                        if len(info) <= 1 or not val:
                            fields[info[0]] = val
                        else:
                            fields[info[0]] = nested_vals(val,
                                                          info[1:],
                                                          key)
                # Add custom fields
                hash = md5()
                hash.update(json.dumps(fields).encode('utf-8'))
                try:
                    fields['time_estimate'] = int(fields['time_estimate'])
                except (KeyError, TypeError):
                    pass
                fields['etl_checksum_md5'] = hash.hexdigest()
                fields['etl_process_status'] = ETL_PROCESS_STATUS
                fields['etl_datetime_local'] = ETL_DATETIME_LOCAL
                fields['etl_pdi_version'] = ETL_PDI_VERSION
                fields['etl_pdi_build_version'] = ETL_PDI_BUILD_VERSION
                fields['etl_pdi_hostname'] = ETL_PDI_HOSTNAME
                fields['etl_pdi_ipaddress'] = ETL_PDI_IPADDRESS
                writer.writerow(fields)

它正在死亡的行是写行。 我在两台机器上安装了相同版本的 Python(使用 Anaconda3),从其他响应来看,问题似乎与 Windows 无法将 Unicode 打印到控制台有关。 我的在DictWriter死在哪里,我不太确定......

通过在我open语句中添加encoding=utf-8来解决... 太奇怪了,它直观地适用于Mac,但Windows决定很糟糕。

相关内容