【问题标题】:Trying to store a png image using ftplib and storbinary ==> UnicodeEncodeError尝试使用 ftplib 和 storbinary ==> UnicodeEncodeError 存储 png 图像
【发布时间】:2019-10-03 15:50:45
【问题描述】:

我是 StackOverflow 的新手,所以我真的很兴奋! ???

我的代码存在以下问题:我正在尝试将“png”图像存储到 FTP 服务器(网站的屏幕截图)。

我正在使用 ftplib 和 selenium(带有 webdriver):

driver.get(<someURL>)
screenshot = driver.save_screenshot(driver.title + '.png')
ftp.storbinary("STOR <PathToServer>" + driver.title + '.png', open(driver.title + '.png', 'rb'))

这种方法适用于网站是用拉丁字符编写的,问题是图像可能是位于泰国、中国或埃及的网站的屏幕截图。在这种情况下,带有以下内容的行:

open(driver.title + '.png', 'rb')

返回臭名昭著的错误:

UnicodeEncodeError: 'latin-1' codec can't encode character '\u1ec7' in position 60: ordinal not in range(256)

我知道 storbinary 只接受二进制数(正如该方法的名称所暗示的那样)。但是,我不明白的是如何对 png 进行“编码”,使其不会导致该错误,从而可以成功地将其存储到 FTP 服务器中。

非常感谢!任何帮助、评论或见解,将不胜感激。 最好的!

【问题讨论】:

  • 我假设它是文件名?您使用 driver.title 作为 .png 名称,这很可能是问题出在哪里。您可能需要将页面标题“转换”为没有非拉丁字符的内容。也许使用 URL 的某些部分,假设它也没有非拉丁字符。
  • 非常感谢 JeffC。我尝试了不同的通用标题,它们没有任何非拉丁字符。它不起作用,不幸的是,我在尝试将 png 存储到 FTP 服务器时仍然遇到 Unicode 错误。但我很欣赏你的评论。

标签: python selenium unicode ftp ftplib


【解决方案1】:

事实是在运行的计算机程序中表示的文本和存储在文件中的文本,文件名和数据库是两个不同的东西。人们可以将前者视为一组字符,而不必关心它们在内部是如何表示的。另一方面,要将文本存储在文件系统 DB 中,通过网络传输,文本必须以字节表示。这种将程序运行时拥有的“纯”文本转换为字节表示的过程称为“编码”。为了更好地理解这一点,我建议阅读this article

Python 3,无论是核心语言还是库,都会在对文本进行任何 I/O 时尝试自动选择正确的文本编码。在您的情况下,它为目标服务器中的文件名选择了“latin1”编解码器。

Latin1 仅限于 200 多个有效字符,不能表示大量字符或字形 - 任何非西方语言字符,甚至一些西方语言字符,例如 Ĺ、Ṕ、ŵ,都不能用它来表示。

建议在让 Python 这样做之前对名称进行手动编码,因为这样我们就可以控制如何处理目标编码中不存在的字符。由于库方法 (.strobinary) 似乎期望文件名作为字符串,因此,我们将名称“解码”回来,但保留第一次编码时获得的无效字符的替换,并将此往返的结果传递给图书馆。

因此,为了保留 latin1 中不存在的有关您的字符的信息,我建议使用转义编码 - 其他选项将替换为“?”或忽略,只是抑制所有字符:

filename = driver.title.encode("latin1", errors="xmlcharrefreplace").decode("latin1") + ".png"
screenshot = driver.save_screenshot(filename)
ftp.storbinary("STOR <PathToServer>" + filename, open(filename, 'rb'))

【讨论】:

  • 你好 jsbueno。非常感谢您出色的 cmets 和见解。您在上面建议的代码有效,我至少可以将 png 存储到 FTP 服务器中(没有导致问题的字符)。我将更仔细地查看您建议的其他选项,以及您引用的文章,以进一步了解我对此事的理解。再一次,我真的很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2019-12-18
相关资源
最近更新 更多