【问题标题】:UnicodeEncodeError : 'ascii' codec can't encode character '\xf1' in position 61: ordinal not in range(128)UnicodeEncodeError:“ascii”编解码器无法在位置 61 编码字符“\xf1”:序数不在范围内(128)
【发布时间】:2023-03-03 23:56:01
【问题描述】:

我在 Python 中调用 google adwords api,然后我将该数据记录到一个 CSV 文件中,我正在处理 UnicodeDecode/EncodeError,我已经尝试了一切来理解它,但现在无济于事。

with open('adgroups.csv', 'w', newline='') as csvfile:
    campaign_name = seed_keyword.title().encode('utf-8','ignore').decode()
    kw_writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    kw_writer.writerow(
        ["CAMPAIGN", "ADGROUP", "MAX BID", "KEYWORD", "MATCH TYPE", "AVERAGE CPC", "SEARCH VOLUME", "COMPETITION"])
    for ad_group in ad_group_list:
        ad_group_name = ad_group['keyword'].title().encode('utf-8','ignore').decode()
        try:
            for keyword_data in ad_group['keyword_data_list']:
                kw_writer.writerow(
                    [campaign_name, ad_group_name, str(ad_group['rpc'] * 0.5).encode('utf-8','ignore').decode(), keyword_data['kw'].encode('utf-8','ignore').decode(), "BROAD",
                     str(keyword_data['cpc']).encode('utf-8','ignore').decode(),
                     str(keyword_data['search_volume']).encode('utf-8','ignore').decode(), str(keyword_data['competition']).encode('utf-8','ignore').decode()])
                kw_writer.writerow(
                    [campaign_name, ad_group_name, str(ad_group['rpc'] * 0.5).encode('utf-8','ignore').decode(), keyword_data['kw'].encode('utf-8','ignore').decode(), "PHRASE",
                     "",
                     "", ""])
                kw_writer.writerow(
                    [campaign_name, ad_group_name, str(ad_group['rpc'] * 0.5).encode('utf-8','ignore').decode(), keyword_data['kw'].encode('utf-8','ignore').decode(), "EXACT",
                     "",
                     "", ""])
        except UnicodeError as e:
            print(e)
            print(str(ad_group))
            raise

File "/var/www/html/ARB-Automation/MultiProcessController.py", line 158, in perform_automation
CSVCampaignSetup.get_in_kw_and_make_adgroups(seed_keyword, ad_group_bid_mapping, cluster_bid_dict)
File "/var/www/html/ARB-Automation/CSVCampaignSetup.py", line 163, in get_in_kw_and_make_adgroups
make_single_adgroup_csv(best_ad_group_data)
File "/var/www/html/ARB-Automation/CSVCampaignSetup.py", line 222, in make_single_adgroup_csv
str(keyword_data['search_volume']).encode('utf-8','ignore').decode(), str(keyword_data['competition']).encode('utf-8','ignore').decode()])

UnicodeEncodeError: 'ascii' codec can't encode character '\xf1' in position 61: ordinal not in range(128)

  1. 当我提到“忽略”时,为什么我首先会收到错误消息?
  2. 如何正确处理?

奇怪的事情 - 第 222 行的堆栈跟踪记录错误,这是一个“编码”错误,据我了解,它试图创建 unicode 字符串的字节表示。 第222行需要编码的数据是一个数字——int或float!那怎么找不到 127 位以下的表示 - 因此是“ascii”编码问题?

另外,我想到了一个解决方案 - 如果我执行 encode('ascii','ignore') 而不是 encode('utf-8','ignore'),它不应该解决问题吗?问题仍然是这是否是理想的解决方案?

我什至打印了原始数据,并在解释器中逐步运行了这段代码,然后我没有收到任何错误。 请帮帮我。

【问题讨论】:

  • 没有更多代码很难确定,但是当您尝试将 unicode 字符串打印到 ascii 文件或终端,或者您设法将默认编码设置为 ascii 而不是 utf8 时,可能会发生此错误.
  • 我正在尝试写入 csv 文件。
  • 如果您在没有任何'ignore'.decode() 的情况下尝试str(keyword_data['search_volume']).encode('utf-8')(以及keyword_data['competition'])会发生什么?
  • 你如何打开文件并创建 csv writer?
  • @JamesLemieux,'ignore' 基本上是说如果你不能对字符串的一部分进行编码,而不是引发错误,忽略输出中的字符串。所以理想情况下在这种情况下应该没有错误......

标签: python encoding python-3.4


【解决方案1】:

请将 python 源文件名的(路径)非英文字符(在本例中为 ñ)更改为英文字符 [a-z0-9] 和有效的操作系统文件名字符。 我使用 pyscripter,但遇到了类似的问题。

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 2021-05-14
    • 1970-01-01
    • 2014-01-22
    • 2016-08-26
    • 2017-03-29
    • 2011-07-05
    • 2018-07-10
    • 2012-04-14
    相关资源
    最近更新 更多