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 文件,里面的內容除了使用了英文標點符號,并沒有什么異樣,沒有什么特殊字符,也沒有什么亂碼??磥硎菚r候祭出解決這類“靈異”問題的終極武器——排除大法。

我用人肉二分法的方式,在保持轉換問題重現的前提下,提取 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 標記,忽略其它可能導致轉換出問題的標記。

未經允許不得轉載:螞蟻搬書 » Calibre 轉換 TXT 文件出現 Errno 21 錯誤的解決方法 – 書伴
微信公眾號:螞蟻搬書
關注我們,分享kindle電子書資源
12000人已關注
分享到:
贊(0) 打賞

評論搶沙發

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

微信掃一掃打賞

捕鸟达人修改金币