看板 Python 關於我們 聯絡資訊
各位前備好 近日BS2要關站 想用python寫一個貼文機器 把備份下來的txt文檔貼到ptt2的個板上 但是在文字編碼上出了問題 以下是貼文部分的code 讀資料夾檔案 for dirPath, dirNames, fileNames in os.walk("./BS2/"): 讀檔 for file in fileNames: print (file) ctrl+p進入發文畫面 tn.write('\x10'.encode('ascii')) time.sleep(1) tn.write("\r\n".encode('big5')) time.sleep(1) 輸入文章標題 tn.write(file.encode('big5')) time.sleep(1) tn.write("\r\n".encode('big5')) time.sleep(1) 開啟備份txt檔並寫入 ftxt = open("./BS2/%s"%file,"r") lines = ftxt.readlines() for line in lines: tn.write(line.encode('big5')) <==主要問題在這列 tn.write("\r\n".encode('big5')) ftxt.close() 等同ctrl+x 文章存檔貼出 tn.write('\x18'.encode('ascii')) time.sleep(1) tn.write("s\r\n0\r\n\r\n".encode('big5') ) time.sleep(1) tn.write('\x0C'.encode('ascii')) time.sleep(1) 問題描述: 如果文章中有用到一些特殊字元(例如表格) big5就吃不進去(會找不到編碼然後程式停止報錯) 如果那邊編碼使用utf-8是不會停止後報錯 但是貼出來的文都變成亂碼 請問這種狀況有解法嗎? 謝謝! --
sandwichpope:小妹妹,妳想要成為魔法少女嗎?03/29 20:32
sandwichpope:要成為魔法少女的第一步就是要先熟練地使用魔法棒03/29 20:32
sandwichpope:大哥哥的這根魔法棒可以讓妳做練習喔03/29 20:32
sandwichpope:只要搓一搓,神奇魔法棒就會變長03/29 20:32
sandwichpope:再用力搓搓,魔法棒就會產生魔法藥水03/29 20:32
sandwichpope:如果喝下魔法藥水,妳就能成為魔法少女了03/29 20:32
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.92.63.147 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1465867582.A.70B.html
alibuda174: 錯誤訊息? 06/14 09:40
Traceback (most recent call last): File "py_bbs2.py", line 78, in <module> tn.write(line.encode('big5')) UnicodeEncodeError: 'big5' codec can't encode character '\u2554' in position 5: illegal multibyte sequence ※ 編輯: aa4live (140.92.63.147), 06/14/2016 09:52:12
alibuda174: 嗯,開檔時加上參數errors='ignore'捨棄那些字元吧 06/14 09:58
alibuda174: 要不然就要自己轉換 06/14 09:59
謝謝! 不知道可以這樣忽略XD 雖然文章會有缺漏一點 但是整體而言備份的效果有做到就好.... 感恩~
kaichan: 可以試一下 "cp950" 而不是 "big5"。 06/14 11:45
kaichan: 像「碁」這個字 cp950 可以轉,big5 不能轉 06/14 11:46
kaichan: 你的這個字也可以用 cp950。 "\u2554".encode('cp950') 06/14 11:52
換成CP950後已沒有問題 之前問題主要出在表格的框線上Orz... 感謝~
uranusjr: 如果是 BBS 的話通常用 big5-hkscs 可以搞定 06/14 12:50
uranusjr: 其實關鍵是你的檔案本身是用什麼編碼存的... 06/14 12:51
生txt檔的程式是直接拿別人的來用 看不出是什麼編碼 不過我再windows的環境執行他應該會是預設的CP950(? 但是CP950能顯示日文感覺一整個怪 (wiki說CP950不含日文,是wiki沒更新還是根本就是我誤會?)
uranusjr: CP950 確實不含日文, 我覺得你應該先確實知道它用的編碼 06/14 18:12
uranusjr: 最簡單的方法裝個 chardet 就可以試著偵測 06/14 18:12
os653: cp950 不含日文沒錯,你有灌 Unicode 補完計畫? 06/14 20:25
os653: 有灌的話在 console 能顯示日文,但是是會有問題的日文 06/14 20:25
eight0: UAO en/decoder https://is.gd/qdGYrI 06/14 23:39
eight0: py3 https://is.gd/opyamH 06/14 23:40
找了一個轉出來含日文的檔案用chardet來測試 結果是這樣 {'encoding': None, 'confidence': 0.0} win7記事本開起來也看不到日文 但是讀檔貼到PTT2個板上顯示是正常的 讀檔是用投兩位推文的方法 ftxt = open("./BS2/%s"%file,"r",encoding='cp950', errors='ignore') 為什麼讀成cp950之後貼到PTT2上面會正常rrrrrr 因為開檔的時候ignore了這些日文的編碼 可是直接貼到P2上他認的出來? 這樣想不知道對不對0.0 ※ 編輯: aa4live (140.92.63.147), 06/15/2016 09:43:02
alibuda174: 可以直接提供檔案嗎? 06/15 09:45
http://tinyurl.com/gpd9je3 測試用檔案在這 放在google硬碟上他預覽是正常能顯示的0.0
uranusjr: 這個檔案我用 Big 5 HKSCS 可以正常顯示 06/15 12:08
alibuda174: 請問為什麼你的檔案編碼是Big5-HKSCS?香港人? 06/15 15:46
eight0: 話說既然 tn.write 吃 bytes,直接把檔案讀成 bin 再餵給 06/15 16:26
eight0: 它就行了吧? 06/15 16:27
感謝點破盲點XD
s860134: 印象中 Big 5 HKSCS 與 Big5-UAO 有些關聯 06/16 00:10
s860134: 但是你說要轉貼到PTT2 用 eight0 的方法應該蠻不錯的 06/16 00:17
s860134: 不要嘗試去 encode 直接 byte 寫 byte 讀 06/16 00:17
真是一個突破盲點! 這樣就不用去管編碼問題了
uranusjr: s860134: UAO 有一部分編碼是照抄 HKSCS 的, 包括假名 06/16 01:06
uranusjr: 而 HKSCS 那部分其實是照抄古早的倚天系統用的編碼表 06/16 01:08
再次感謝以上各位大大留言<(_ _)> ※ 編輯: aa4live (140.92.63.147), 06/16/2016 14:45:31
alibuda174: 請問,你不管編碼問題的作法,有成功轉貼到ptt2嗎? 06/16 21:17
aa4live: 有成功喔! 06/17 00:09
s860134: BBS 都是 BIG-UAO 編碼,telnet 本身就是吃 byte 輸入的 06/17 02:43