【问题标题】:Continuing for loop after exception in Python在Python中出现异常后继续循环
【发布时间】:2021-06-01 20:06:42
【问题描述】:

所以首先我看到了类似的问题,但没有任何工作/不适用于我的问题。 我正在编写一个程序,该程序接收一个文本文件,其中包含要在 Youtube 上搜索的大量搜索查询。程序逐行遍历文本文件。但是这些具有无法解码的特殊 UTF-8 字符。所以在某个时刻,程序会以一个

UnicodeDecodeError:“charmap”编解码器无法解码位置 1826 中的字节 0x81:字符映射到

由于我无法检查输入的每一行,我希望它除了错误之外,打印它正在处理的行并在该点继续。 由于错误没有发生在我的 for 循环中,而是 for 循环本身,我不知道如何编写 try...except 语句。 这是代码:

import urllib.request
import re
from unidecode import unidecode
with open('out.txt', 'r') as infh,\
        open("links.txt", "w") as outfh:
    for line in infh:
        try:
            clean = unidecode(line)
            search_keyword = clean
            html = urllib.request.urlopen("https://www.youtube.com/results?search_query=" + search_keyword)
            video_ids = re.findall(r"watch\?v=(\S{11})", html.read().decode())
            outfh.write("https://www.youtube.com/watch?v=" + video_ids[0] + "\n")
            #print("https://www.youtube.com/watch?v=" + video_ids[0])
        except:
            print("Error encounted with Line: " + line)

这是完整的错误消息,可以查看 for 循环本身导致了问题。

Traceback(最近一次调用最后一次): 文件“ytbysearchtolinks.py”,第 6 行,在 对于 infh 中的行: 解码中的文件“C:\Users\nfeyd\AppData\Local\Programs\Python\Python36\lib\encodings\cp1252.py”,第 23 行 返回 codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError:“charmap”编解码器无法解码位置 1826 中的字节 0x81:字符映射到

如果您需要我正在使用的输入示例:https://pastebin.com/LEkwdU06

【问题讨论】:

  • 你的try-except-block 看起来不错。我根据您的输入运行了您的代码(在没有 unidecode 的 Linux 上),它对我有用。
  • 你是用我的粘贴做的吗?它是关于 Unicode 的,所以这很重要?
  • 是的,我下载了文件并运行了与您在此处发布的完全相同的代码,唯一的区别是我没有导入和使用unidecode。我得到了一个 YT 链接列表和一些错误,例如 Error encounted with Line: Baianá+Bakermat,但它仍在继续。
  • 我实现了 Unidecode 包,因为我想考虑这些,因为 'á' 被解码为 a。但其他角色不是。我的问题是为什么 try...except 没有捕获到这个错误。
  • 我明白了。请在下面的答案中输入代码,它对我有用。

标签: python python-3.x for-loop exception try-catch


【解决方案1】:

try-except-block 看起来是正确的,应该允许您捕获所有发生的异常。

unidecode 的使用可能对您没有帮助,因为非 ASCII 字符必须在 URL 中以特定方式编码,例如,请参阅 here

一种解决方案是使用urllibquote() function。根据文档:

使用%xx 转义符替换字符串中的特殊字符。

这就是您提供的输入对我有用的方法:

import urllib.request
from urllib.parse import quote
import re

with open('out.txt', 'r', encoding='utf-8') as infh,\
         open("links.txt", "w") as outfh:
     for line in infh:             
         search_keyword = quote(line)
         html = urllib.request.urlopen("https://www.youtube.com/results?search_query=" + search_keyword)
         video_ids = re.findall(r"watch\?v=(\S{11})", html.read().decode())
         outfh.write("https://www.youtube.com/watch?v=" + video_ids[0] + "\n")
         print("https://www.youtube.com/watch?v=" + video_ids[0])

编辑: 想了想,相信你遇到了以下问题:

您在 Windows 上运行代码,显然,Python 将尝试在 Windows 上使用 cp1252 编码打开文件,而您共享的文件是 UTF-8 编码:

$  file out.txt
out.txt: UTF-8 Unicode text, with CRLF line terminators

这将解释您遇到的异常以及为什么它没有被您的try-except-block 捕获(它在尝试打开文件时发生)。

确保您在打开文件时使用的是encoding='utf-8'

【讨论】:

  • 没有解决我的异常,但使用引用函数比我解决编码问题的方法要聪明得多。谢谢!
  • 你在打开文件时使用encoding='utf-8'吗?
  • 添加了关于为什么会这样的解释。
【解决方案2】:

我运行了您的代码,但没有遇到任何问题。您是否使用 virtualenv 创建了虚拟环境并安装了您使用的所有软件包?

【讨论】:

  • 我在 Windows 上。所有软件包都已安装。该程序一直运行,直到捕获到异常为止。所以 try...except 不起作用,因为解码错误不会被忽略。
  • 好的,我在 linux 上测试过抱歉,可能问题出在你的 out.txt 中的编码文件文本,我不知道,但也许你可以尝试完全使用 UTF-8 编码这个文件跨度>
  • 如前所述,我的问题不在于错误本身。我希望例外的工作。
猜你喜欢
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2018-03-20
  • 2015-08-19
相关资源
最近更新 更多