python - 尝试使用 ftplib 和 storbinary 存储 png 图像 ==> UnicodeEncodeError

标签 python selenium unicode ftp ftplib

我是 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 服务器中。

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

最佳答案

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

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

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

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

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

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

关于python - 尝试使用 ftplib 和 storbinary 存储 png 图像 ==> UnicodeEncodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58222747/

相关文章:

python - python 2.7中Unicode字符串到ASCII的转换

python - 无法在 Visual Studio 代码中选择内核,findKernel 崩溃 : 503 Service Unavailable

python - 如何计算每个产品的滚动平均值?

javascript - Selenium (Node.js) 截屏速度太慢

unit-testing - 使用 PHPUnit 组织 Selenium 测试的最佳方式是什么?

python - 在 Python 中预组合 Unicode 字符序列

c++ - 如何可移植地将 std::wstring 写入文件?

Python deepcopy,对象变化中的字典值

python lockf 和 flock 行为

Selenium IDE : Get row count in table