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 误以为使用了 Textile 标记语言中的插入图片的语法(即 !/carver.png!
,从测试来看,至少出现六次才会被 Calibre 认为是 Textile 语法)。
如果只有这个问题,只会导致文档缺字,并不会导致转换失败。导致转换失败的根源是,在 Calibre 认为该文档使用了 Textile 标记语言的同时还遇到了“错误的标记”,也就是叹号后面紧接着的引号(如 !"内容!
),这就导致 Calibre 在误以为是图片的基础上,又尝试在错误的位置引用根本不存在的图片,这也是为什么会出现提示某个路径是文件夹的原因。最终,在错上加错的情况下,转换被中断了。
知道了问题所在,解决方法就自然显现了:要么预先把原 TXT 文档中的英文标点(至少是英文叹号)全部替换成中文标点;要么在转换时,将【格式化样式】的值改为【Markdown】或【plain】,以禁止 Calibre 解析可能出问题的标记语言(建议同时用【搜索 & 替换】把英文标点替换成中文标点)。
对于第二种解决方案,需要注意一种情况。如果你在转换 TXT 文档的同时,需要添加 Markdown 标记以便自动生成电子书目录,选用【plain】会导致 Calibre 忽略包括 Markdown 在内的所有结构标记的解析。所以最稳妥的方法是,在添加标记的同时,预先把文档中的英文标点符号转换成中文,或者选用【Markdown】,让 Calibre 只检测 Markdown 标记,忽略其它可能导致转换出问题的标记。
© 「书伴」原创文章,转载请注明出处及原文链接:https://bookfere.com/post/779.html
“Calibre教程”相关阅读
- 如何修复用 Calibre 通过 USB 导入 Kindle 的电子书封面
- 如何解决 Kindle 电子书无法更换字体的问题
- 如何用 Calibre 和 Count Pages 插件统计电子书的字数和页数
- 英文电子书使用字典查词时选中整段的解决方法
- Calibre 使用教程之为 Kindle 电子书添加页码
- Calibre 使用教程之抓取 RSS 制成电子书
- Calibre 使用教程之通过 WiFi 向 Kindle 传输电子书
- Calibre 使用教程之抓取网站页面制成电子书
- Calibre 使用教程之为电子书添加更换字体
- Calibre 使用教程之电子书繁体字转简体字
- Calibre 发布 3.0 版本(附常用功能梳理)
- Calibre 使用教程之批量获取电子书元数据
- 把 TXT 文档转换成带目录的 MOBI 格式电子书
- Calibre 常用命令行工具详解之 ebook-convert
- 用 GitHub Actions 让 Calibre 定时推送新闻到 Kindle
calibre, version 4.10.1 (win32, embedded-python: True)
转换错误: 失败: 转换书籍 第 1 本,共 1 本 (天龙八部(旧版))
转换书籍 第 1 本,共 1 本 (天龙八部(旧版))
E:\Calibre2\\app\pylib.zip\dateutil\parser\_parser.py:1177: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode – interpreting them as being unequal
Conversion options changed from defaults:
markdown_extensions: u’toc, footnotes, tables’
output_profile: u’kindle_pw3′
mobi_file_type: u’new’
asciiize: True
remove_fake_margins: False
verbose: 2
smarten_punctuation: True
read_metadata_from_opf: u’C:\\Users\\lixif\\AppData\\Local\\Temp\\calibre_0hhl2i\\9vhomk.opf’
Resolved conversion options
calibre version: 4.10.1
{‘asciiize’: True,
‘author_sort’: None,
‘authors’: None,
‘base_font_size’: 0.0,
‘book_producer’: None,
‘change_justification’: u’original’,
‘chapter’: u”//*[((name()=’h1′ or name()=’h2′) and re:test(., ‘\\s*((chapter|book|section|part)\\s+)|((prolog|prologue|epilogue)(\\s+|$))’, ‘i’)) or @class = ‘chapter’]”,
‘chapter_mark’: u’pagebreak’,
‘comments’: None,
‘cover’: None,
‘debug_pipeline’: None,
‘dehyphenate’: True,
‘delete_blank_paragraphs’: True,
‘disable_font_rescaling’: False,
‘dont_compress’: False,
‘duplicate_links_in_toc’: False,
’embed_all_fonts’: False,
’embed_font_family’: None,
‘enable_heuristics’: False,
‘expand_css’: False,
‘extra_css’: None,
‘extract_to’: None,
‘filter_css’: u”,
‘fix_indents’: True,
‘font_size_mapping’: None,
‘format_scene_breaks’: True,
‘formatting_type’: u’auto’,
‘html_unwrap_factor’: 0.4,
‘input_encoding’: None,
‘input_profile’: ,
‘insert_blank_line’: False,
‘insert_blank_line_size’: 0.5,
‘insert_metadata’: False,
‘isbn’: None,
‘italicize_common_cases’: True,
‘keep_ligatures’: False,
‘language’: None,
‘level1_toc’: None,
‘level2_toc’: None,
‘level3_toc’: None,
‘line_height’: 0.0,
‘linearize_tables’: False,
‘margin_bottom’: 5.0,
‘margin_left’: 5.0,
‘margin_right’: 5.0,
‘margin_top’: 5.0,
‘markdown_extensions’: u’toc, footnotes, tables’,
‘markup_chapter_headings’: True,
‘max_toc_links’: 50,
‘minimum_line_height’: 120.0,
‘mobi_file_type’: u’new’,
‘mobi_ignore_margins’: False,
‘mobi_keep_original_images’: False,
‘mobi_toc_at_start’: False,
‘no_chapters_in_toc’: False,
‘no_inline_navbars’: True,
‘no_inline_toc’: False,
‘output_profile’: ,
‘page_breaks_before’: u”//*[name()=’h1′ or name()=’h2′]”,
‘paragraph_type’: u’auto’,
‘personal_doc’: u'[PDOC]’,
‘prefer_author_sort’: False,
‘prefer_metadata_cover’: False,
‘preserve_spaces’: False,
‘pretty_print’: False,
‘pubdate’: None,
‘publisher’: None,
‘rating’: None,
‘read_metadata_from_opf’: u’C:\\Users\\lixif\\AppData\\Local\\Temp\\calibre_0hhl2i\\9vhomk.opf’,
‘remove_fake_margins’: False,
‘remove_first_image’: False,
‘remove_paragraph_spacing’: False,
‘remove_paragraph_spacing_indent_size’: 1.5,
‘renumber_headings’: True,
‘replace_scene_breaks’: u”,
‘search_replace’: ‘[]’,
‘series’: None,
‘series_index’: None,
‘share_not_sync’: False,
‘smarten_punctuation’: True,
‘sr1_replace’: None,
‘sr1_search’: None,
‘sr2_replace’: None,
‘sr2_search’: None,
‘sr3_replace’: None,
‘sr3_search’: None,
‘start_reading_at’: None,
‘subset_embedded_fonts’: False,
‘tags’: None,
‘timestamp’: None,
‘title’: None,
‘title_sort’: None,
‘toc_filter’: None,
‘toc_threshold’: 6,
‘toc_title’: None,
‘transform_css_rules’: ‘[]’,
‘txt_in_remove_indents’: False,
‘unsmarten_punctuation’: False,
‘unwrap_lines’: True,
‘use_auto_toc’: False,
‘verbose’: 2}
InputFormatPlugin: TXT Input running
on C:\Users\lixif\AppData\Local\Temp\calibre_0hhl2i\7qk8t4.txt
Python function terminated unexpectedly
[Error 5] : u’C:\\Users\\lixif\\AppData\\Local\\Temp\\calibre_0hhl2i\\5tozs1_plumber’ (Error Code: 1)
Traceback (most recent call last):
File “site.py”, line 114, in main
File “site.py”, line 88, in run_entry_point
File “site-packages\calibre\utils\ipc\worker.py”, line 209, in main
File “site-packages\calibre\gui2\convert\gui_conversion.py”, line 43, in gui_convert_override
File “site-packages\calibre\gui2\convert\gui_conversion.py”, line 28, in gui_convert
File “site-packages\calibre\ebooks\conversion\plumber.py”, line 1110, in run
File “site-packages\calibre\customize\conversion.py”, line 241, in __call__
File “site-packages\calibre\__init__.py”, line 435, in __enter__
WindowsError: [Error 5] : u’C:\\Users\\lixif\\AppData\\Local\\Temp\\calibre_0hhl2i\\5tozs1_plumber’
请问这到底是什么问题。我更换了很多TXT文件,转换mobi格式时一律都是失败。晚上找不到任何解决的办法。谢谢了
你的 Calibre 安装路径包含中文字符了吗?
书伴,你好。我的Calibre安装在E盘,磁盘标签是汉字。我卸载后重新安装在默认路径C:\progam files\Calibre2。可是问题如故。我的系统是windows10 64位家庭版,安装文件是官网上下载的calibre-64bit-4.10.1。
感谢你的回复。
你安装杀毒软件了吗?这里有一个类似问题的讨论,貌似是因为 Calibre 没有读取临时文件的权限导致的。解决这个问题需要检查一下有没有什么软件阻止 Calibre 读取临时文件。
Calibre其实不好用,转TXT用贴吧里有人编译的一个小软件,转换速度块而且没有乱码,十几兆的TXT转过来速度快而且没有问题。
你好 我想问一下 是什么软件啊,我想转的书比较大 用calibre太慢了
管理员您好,我刚买的kindle oasis3的充电充满只到99%…我使用到50%,重启了一次后用亚马逊的充电头充了11小时,还是99%。这是什么问题,是机子的问题吗
充了这么长时间仍然是 99% 可能就是设备或系统的问题了,建议直接联系亚马逊官方客服处理。
kindle直接看txt会缺字也是因为这个原因吗?
应该不是,Kindle 阅读 TXT 文档缺字应该是其它原因导致的。
有点厉害,居然能找出是识别markdown语法的问题,好有趣
确切的说应该是 Textile 语法导致的问题。软件总归不是智能的,避免不了非预期的意外。
非常感谢管理员,因为我之前用了几年都没有什么问题,突然在转换时遇到这样的问题,感到很费解,一度以为是因为文件过大导致的,但是后来我又试了几个比他还大的文件进行转换,也都成功了,所以向咱们这边寻求帮助,感谢专注细致且非常专业的解答!我会试试以上说的方法在操作试试。再一个问题就是calibre转换时在TXt输入界面下—段落样式&格式化样式都是auto,今后转换是否需要将格式化样式改成plain?我看到plain代表没有格式化的情况,这种情况下的转换出的mobi文件,会跟auto有什么不同呢?
是否需要格式化取决于你的意图。如果你要转换的 TXT 有意做了一些标记,比如用 Markdown 标记了标题
## 标题文字
,那就可以选择 auto 或 Markdown 让 Calibre 将其转换成<h2>标题文字</h2>
,这样在电子书中就可以突出显示标题了。如果不是有意做标记,就无所谓选不选了,默认 auto 一般没啥问题,但是一旦出现预期之外的标记,被 Calibre 自动检测到并在转换时产生了非预期的结果(就像你遇到的这种情况),就需要手动选择 plain 禁止 Calibre 自动检测任何标记了。收到,已经将该文件的txt成功转mobi了!如果设置plain格式下,则不能识别全文所有##标记,也就不能生成目录。之后我将标点符号!和?都按你的要求转中文标点后,选择auto,就成功生成了带目录的mobi文件!再也没有错误提示。再次感谢亲的帮助!让我顺利解决了这个疑难杂症!
不客气。如果是为生成目录做了 Markdown 标记,那顺便把英文标点替换成中文标点更好,一举两得,读着舒服,转换也不会出错。
如果今后遇到其它类似问题,为了生成 Markdown 目录,也可以将【格式化样式】的值设置为【Markdown】,让 Calibre 只检测解析 Markdown 语法,忽略其它语法。
嗯嗯,因为复杂的c语言代码我也不懂,做的时候需要增添目录情况下,我会每一章节的开头添加一个###,我之前都是默认上下格式都选择Auto.那以后格式化样式,直接设置markdon就可以了是吗?如果格式化样式选择auto,就需要将英文标点替换中文标点后,再进行转换?
对,你这样做是没错的。一般为了添加目录或格式化标题,用的都是 Markdown 语法,选择 Markdown 就可以让 Calibre 只处理 Markdown 标记忽略其它标记,从而避免可能出现的意外错误。
受教了,非常感谢您的帮助!