python function terminated_Calibre 转换 TXT 文件出现 Errno 21 错误的解决方法 – 书伴
昨天有一位名为 sumina 的小伙伴留言反馈了一个很奇怪的问题,他在用 Calibre 将某个 TXT 文件转换成 MOBI 格式时出错了,而其它的 TXT 文件却可以正常转换,并且出错的 TXT 看起来没有什么问题。
在得到这位小伙伴提供的样本 TXT 文件后,我首先用 Calibre 测试了一下,果然出现了如下错误:
# 已省略不相关内容……
Python function terminated unexpectedly: [Errno 21] Is a directory: u'/var/folders/1r/1qwpq6f56hz4xp0gwv7br_kr0000gn/C/calibre_3.40.1_tmp_BSEcvF/'
InputFormatPlugin: TXT Input running
on /var/folders/1r/1qwpq6f56hz4xp0gwv7br_kr0000gn/C/calibre_3.40.1_tmp_BSEcvF/JAVXx3.txt
Reading text from file...
Detected input encoding as gbk with a confidence of 99.0%
Auto detected paragraph type as unformatted
Auto detected formatting as textile
Running text through textile conversion...
Traceback (most recent call last):
File "/Applications/calibre.app/Contents/Resources/Python/lib/python2.7/site.py", line 154, in main
return run_entry_point()
File "/Applications/calibre.app/Contents/Resources/Python/lib/python2.7/site.py", line 114, in run_entry_point
return getattr(pmod, func)()
File "site-packages/calibre/utils/ipc/worker.py", line 199, in main
File "site-packages/calibre/gui2/convert/gui_conversion.py", line 42, in gui_convert_override
File "site-packages/calibre/gui2/convert/gui_conversion.py", line 27, in gui_convert
File "site-packages/calibre/ebooks/conversion/plumber.py", line 1106, in run
File "site-packages/calibre/customize/conversion.py", line 244, in __call__
File "site-packages/calibre/ebooks/conversion/plugins/txt_input.py", line 268, in convert
File "site-packages/calibre/ebooks/conversion/plugins/txt_input.py", line 117, in fix_resources
IOError: [Errno 21] Is a directory: u'/var/folders/1r/1qwpq6f56hz4xp0gwv7br_kr0000gn/C/calibre_3.40.1_tmp_BSEcvF/'
但是遗憾的是,错误信息除了提示一个路径“是个文件夹”外([Errno 21] Is a directory ),并没有给出更多有价值的信息。而根据以往的使用经验来看,转换一个 TXT 跟什么目录并不应该有什么联系。
由于其它 TXT 文件的转换是正常的,可以确定 Calibre 的转换功能应该是没问题的。那问题就应该出在 TXT 内容上面的。但是打开 TXT 文件,里面的内容除了使用了英文标点符号,并没有什么异样,没有什么特殊字符,也没有什么乱码。看来是时候祭出解决这类“灵异”问题的终极武器——排除大法。
我用人肉二分法的方式,在保持转换问题重现的前提下,提取 TXT 文档中的内容逐次测试,以期将问题缩小到某个段落上。在将范围缩小至 20 段文字后,有趣的现象出现了。当保持这 20 段内容时,转换问题可重现,但是不论删除头几行、后几行还是中间几行段论,问题都不会重现,就好像问题不是出在某个字符或某个段落上,而是呈“分布式”出现的。虽然离问题的根源很近了,但是并不显然。
于是我继续缩小范围,直至在保持转换问题重现的状态下,将内容缩减到如下所示:
!"逢!
!他!
!啊!
!可!
!我!
!说!
在这种情况下,删除任何一个字符,转换问题都会消失。还有一个有趣的现象是,当删除其中的“引号”后再转换时,输出信息竟然出现了如下这种对于转换 TXT 纯文本文档来说相当奇怪的内容:
# 已省略不相关内容……
Converting XHTML to Mobipocket markup...
Failed to find image: 逢
Failed to find image: 他
Failed to find image: 啊
Failed to find image: 可
Failed to find image: 我
Failed to find image: 说
Serializing markup content...
# 已省略不相关内容……
纯文本文档怎么会出现与图片相关的信息呢?回头再观察“最小化”后的内容,发现里面的“惊叹号”是成对重复出现的,并且中间都包含一个字符,很像一种标记语法。到现在我才搞明白怎么回事。
▲ Calibre 默认会自动检测 TXT 文档结构
Calibre 在将 TXT 文件转换成 MOBI 格式电子书前会先将其转换成 HTML。在此过程中 Calibre 默认会自动检测 TXT 文档的结构(如上图所示,可以看到在【TXT 输入】设置项中的【格式化样式】默认值是【auto】),这就意味着 Calibre 会“自动决定使用哪一个格式化处理器”,当它发现某一种标记语法(如 Markdown)重复出现了几次,就会认为文档结构使用了该标记语言并试图将其转换成 HTML。
在出现转换问题的样本中,由于原文档输入不规范,在本应使用中文标点的地方使用了英文标点,并且其中过多使用的英文感叹号“!”所呈现的文档结构,让 Calibre 误以为使用了 !/carver.png!,从测试来看,至少出现六次才会被 Calibre 认为是 Textile 语法)。
如果只有这个问题,只会导致文档缺字,并不会导致转换失败。导致转换失败的根源是,在 Calibre 认为该文档使用了 Textile 标记语言的同时还遇到了“错误的标记”,也就是叹号后面紧接着的引号(如 !"内容!),这就导致 Calibre 在误以为是图片的基础上,又尝试在错误的位置引用根本不存在的图片,这也是为什么会出现提示某个路径是文件夹的原因。最终,在错上加错的情况下,转换被中断了。
知道了问题所在,解决方法就自然显现了:要么预先把原 TXT 文档中的英文标点(至少是英文叹号)全部替换成中文标点;要么在转换时,将【格式化样式】的值改为【Markdown】或【plain】,以禁止 Calibre 解析可能出问题的标记语言(建议同时用【搜索 & 替换】把英文标点替换成中文标点)。
对于第二种解决方案,需要注意一种情况。如果你在转换 TXT 文档的同时,需要添加 Markdown 标记以便自动生成电子书目录,选用【plain】会导致 Calibre 忽略包括 Markdown 在内的所有结构标记的解析。所以最稳妥的方法是,在添加标记的同时,预先把文档中的英文标点符号转换成中文,或者选用【Markdown】,让 Calibre 只检测 Markdown 标记,忽略其它可能导致转换出问题的标记。
python function terminated_Calibre 转换 TXT 文件出现 Errno 21 错误的解决方法 – 书伴相关推荐
- python文本筛选_使用python对多个txt文件中的数据进行筛选的方法
使用python对多个txt文件中的数据进行筛选的方法 一.问题描述 筛选出多个txt文件中需要的数据 二.数据准备 这是我自己建立的要处理的文件,里面是随意写的一些数字和字母 三.程序编写 impo ...
- 百度网盘压缩下载文件的CRC校验错误的解决方法
转载自:http://blog.sina.com.cn/s/blog_610787990102xcnv.html 百度网盘压缩下载文件的CRC校验错误的解决方法 从百度网盘用打包压缩方式下载的文件在解 ...
- 7z解压crc错误_百度网盘压缩下载文件的CRC校验错误的解决方法
转载自:http://blog.sina.com.cn/s/blog_610787990102xcnv.html 百度网盘压缩下载文件的CRC校验错误的解决方法 从百度网盘用打包压缩方式下载的文件在解 ...
- 用Python执行Django数据迁移时报!(1091错误及解决方法)
前言: 今天为大家带来的内容是用Python执行Django数据迁移时报!(1091错误及解决方法)本文内容具有不错的参考意义,希望在此能够帮助到大家! 前几天在Pycharm 中的Terminal下 ...
- 服务器复制文件出现io错误,win7系统复制文件时发生IO错误的解决方法
很多小伙伴都遇到过win7系统复制文件时发生IO错误的困惑吧,一些朋友看过网上零散的win7系统复制文件时发生IO错误的处理方法,并没有完完全全明白win7系统复制文件时发生IO错误是如何解决的,今天 ...
- pta段错误是什么意思_用Python执行Django数据迁移时报!(1091错误及解决方法)...
前言: 今天为大家带来的内容是用Python执行Django数据迁移时报!(1091错误及解决方法)本文内容具有不错的参考意义,希望在此能够帮助到大家! 前几天在Pycharm 中的Terminal下 ...
- Win10 64位文件调用失败提示错误0x8002801c解决方法
1.自行将MSCOMCTL.OCX组件复制到C:\Windows\SysWOW64\目录下: 2.在C:\Windows\SysWOW64\ 目录下找到cmd.exe文件,右键单击,"以管理 ...
- python安装错80072ee2_更新Win10系统出现0x80072ee2错误的解决方法
win10系统的出现就是因为技术的更新与突破,为了满足我们日益增长的技术需求.我们在获得最新的技术之时,还需要不断地开拓获得又一次的创新与发展.就win10系统而言,也是一次又一次的进行系统的更新.不 ...
- 打开CHM文件出现错误的解决方法
英文Windows无法打开中文名CHM文件的解决方法 ------------------------------------------------------------------------- ...
- python将字符串写入txt文件_python将字符串以utf-8格式保存在txt文件中的方法
python将字符串以utf-8格式保存在txt文件中的方法 如下所示: #ltp_data 字符串 写进777.txt 1. def save(filename, contents): fh = o ...
最新文章
- 人工智能落地之路:从概念验证到产品
- Log4j比较全面的配置
- 6款国内外SNS开源软件 搭建社交网站利器
- hm编码工具使用_HM集团旗下最高端品牌ARKET将进驻中国,带你看看真正的“北欧风”...
- Windows平台下sbt的安装设置
- onvif协议_大华的录像机添加海康摄像头,使用了onvif协议,为啥也添加不进去?...
- systemctl自定义service
- 图片类word报告生成器
- 手机+PC电脑如何使用油猴插件和油猴脚本?
- 提取网页内容-Python
- 用excel数据批量填充word表格
- 高仿网易评论列表效果之界面生成
- IOS8 keyboardWillShow 在UIKeyboardWillShowNotification 调用两次 问题解决
- python interface_面向对象编程语言中的接口(Interface)
- 基于物联网的智慧农业监测系统(前端界面有web端和微信小程序端)
- SolidWorks宏工具介绍——初识宏工具
- 手机移动OA:指尖上也可以拥有会议助手
- android java加密_Android、iOS和Java通用的AES128加密解密示例代码
- Android应用防xposed注入,android hook 框架 xposed 如何实现注入
- java 服务器 http请求_Java网络编程——发送HTTP请求到服务器
热门文章
- 倍福plc有什么优点_BECKHOFF倍福安全模块的优点和缺点
- 中文汉化AE插件-图层边界自动填充生长动画插件
- Windows API、SDK和CRT的关系
- 2019新版《龙果学院Elasticsearch顶尖高手系列(高手进阶篇教程)》
- 谱曲软件-MuseScore
- 如何让bootbox弹框垂直居中
- 如何使用SiteSucker下载HTML源文件?下载html源文件的两种方法
- 红米K40稳定版12.5.3.0 刷面具 magisk一键ROOT教程 附工具
- linux查询文件md5sum,Linux下通过md5sum生成MD5文件校验MD5
- 改进的cholesky matlab,矩阵的Cholesky分解的Matlab实现