[問題] 輸出到文件的格式能分別設定嗎

看板Python作者 (玉米)時間3年前 (2021/08/20 12:28), 3年前編輯推噓15(15023)
留言38則, 7人參與, 3年前最新討論串1/1
各位大大好,小弟剛接觸python約一個月 目前都是在yt看影片自學 上週終於學到網頁爬蟲,範例是抓PTT版面標題 於是就自己寫了一個抓取留言的小程式 也經過了很多次的修改後把內文跟作者ID之類的加上去 最近終於修改完成了 只是我發現輸出到記事本的格式挺讓人眼花的 想問看看有沒有辦法讓推文標籤ID及內容置左 時間置右這樣去做輸出 不管怎麼做好像都沒有辦法讓格式整齊點 所以上來問問看有沒有甚麼方法可以做到 程式有點長放在github裡 https://reurl.cc/qg7On3 應該有很多地方可以精簡,還在學習中請見諒 另外也有發現抓內容部分可能會因為發文者的文字習慣會有bug產生 更新 目前輸出到記事本的推文部分是這樣 推 ddavid: 置左置右這些可以去查一下Python format string的各種用法 08/20 12:45 → Lyumin: 查到都是print的用法 用在file.write裡好像沒作用 08/20 12:50 推 lycantrope: 你有查string format align? string先format再寫入吧 08/20 13:10 我想輸出成以下這樣 推 ddavid: 置左置右這些可以去查一下Python format string的各種用法 08/20 12:45 → Lyumin: 查到都是print的用法 用在file.write裡好像沒作用 08/20 12:50 推 lycantrope: 你有查string format align? string先format再寫入吧 08/20 13:10 程式是用while去做迴圈然後輸出 試過"{:>8}".format()還是沒辦法對齊 file.write(tag[x].text+id[x].text+msg[x].text+time[x].text) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.35.43.66 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1629433719.A.118.html

08/20 12:45, 3年前 , 1F
置左置右這些可以去查一下Python format string的各種用法
08/20 12:45, 1F

08/20 12:50, 3年前 , 2F
查到都是print的用法 用在file.write裡好像沒作用
08/20 12:50, 2F

08/20 13:10, 3年前 , 3F
你有查string format align? string先format再寫入吧
08/20 13:10, 3F

08/20 13:25, 3年前 , 4F
https://reurl.cc/MAp043 Python string format
08/20 13:25, 4F

08/20 13:52, 3年前 , 5F
其實你問題裡也可以附上輸出的範例
08/20 13:52, 5F

08/20 13:53, 3年前 , 6F
然後做法是先建好format string,才把該string寫入檔案
08/20 13:53, 6F

08/20 14:03, 3年前 , 7F
先印看看字串是不是符合你預期 再寫入檔案應該就OK
08/20 14:03, 7F
※ 編輯: Lyumin (114.35.43.66 臺灣), 08/20/2021 15:29:39

08/20 16:00, 3年前 , 8F
format裡面要有參數 print("{:<10}123".format("你好"))
08/20 16:00, 8F

08/20 16:00, 3年前 , 9F
可以先試試小功能再慢慢組合起來
08/20 16:00, 9F
有的有試過下面,只是要完全對再一起感覺不可能 file.write("{:<3}".format(tag[x].text)+"{:<3}".format(id[x].text)+"{:<50}".format(msg[x].text)+"{:>50}".format(time[x].text)) ※ 編輯: Lyumin (114.35.43.66 臺灣), 08/20/2021 16:10:32

08/20 16:23, 3年前 , 10F
你應該是遇到中文對齊的問題
08/20 16:23, 10F

08/20 16:29, 3年前 , 11F
你能實際給對齊失敗的例子嗎,搞不太清楚你的問題是哪一種
08/20 16:29, 11F

08/20 16:30, 3年前 , 12F
不知道是你對齊設定下錯、上面說的中文還是資料特殊例外
08/20 16:30, 12F

08/20 16:34, 3年前 , 13F
id加上冒號空格最長就14字,靠右對齊應該是"{:<14}"吧
08/20 16:34, 13F

08/20 16:35, 3年前 , 14F
推文本身中英混雜,要先處理全半形長度不同才補空格
08/20 16:35, 14F

08/20 16:53, 3年前 , 15F
原來ID加冒號最長是14!我是測試15可以讓標籤到冒號對齊,
08/20 16:53, 15F

08/20 16:53, 3年前 , 16F
只是目前推文內容跟時間還沒辦法,全打英文的最長字元是52
08/20 16:53, 16F

08/20 16:54, 3年前 , 17F
,這部分我就不太懂怎麼去切了
08/20 16:54, 17F

08/20 16:57, 3年前 , 18F

08/20 16:58, 3年前 , 19F
輸出時間無法對齊https://i.imgur.com/Ln3sRSg.jpg
08/20 16:58, 19F

08/20 17:07, 3年前 , 20F
你可以用unicodedata.east_asian_width 去計算width啦
08/20 17:07, 20F

08/20 18:02, 3年前 , 21F
腦袋還是卡關中,推文加空格到日期是54,但日期就是沒對齊
08/20 18:02, 21F

08/20 19:06, 3年前 , 22F
怎麼不乾脆寫成CSV
08/20 19:06, 22F

08/20 19:49, 3年前 , 23F
直接弄成dataframe一切都解決,堅持用plain text太累
08/20 19:49, 23F

08/20 21:19, 3年前 , 24F
問題應該出在 format 不管對英文或中文都是算一個字元寬?
08/20 21:19, 24F

08/20 21:21, 3年前 , 25F
所以你必須先算出實際的單字元總寬度再動態調整要用來對齊的
08/20 21:21, 25F

08/20 21:21, 3年前 , 26F
數字
08/20 21:21, 26F

08/20 21:23, 3年前 , 27F
或是直接修改 format 原始碼讓他把中文當成雙位元的字寬
08/20 21:23, 27F

08/20 21:27, 3年前 , 28F
https://reurl.cc/qg7K90 不知道這個解法是否能解決你的問題
08/20 21:27, 28F

08/20 21:30, 3年前 , 29F
之前用一個自動換行的函式,也是去改原始碼才解決這問題
08/20 21:30, 29F

08/20 21:59, 3年前 , 30F
https://reurl.cc/mL8pyA 先count字數寬度再補空格
08/20 21:59, 30F
感謝大大,用這個方法解決了,只是我有個疑問為什麼max count=60, 是因為使用unicodedata.east_asian_width查出來最大的字串是58只要設比他大就好嗎? 另外既然知道最大字元數是58,為什用format string的置左會沒有效果? https://reurl.cc/7rGY6D 今天增加好多知識阿 ※ 編輯: Lyumin (114.41.38.123 臺灣), 08/21/2021 01:07:36

08/21 03:20, 3年前 , 31F
批踢踢的 BBS 本身是 Big5 編碼,要算字元長度補空格的話,
08/21 03:20, 31F

08/21 03:20, 3年前 , 32F
建議可以將中英混合的字串轉成 big5 再算長度
08/21 03:20, 32F

08/21 03:20, 3年前 , 33F
比如 'ptt'.encode('big5') 的結果會是 3
08/21 03:20, 33F

08/21 03:21, 3年前 , 34F
'批踢踢'.encode('big5') 的結果會是 6
08/21 03:21, 34F

08/21 03:22, 3年前 , 35F
len('ptt'.encode('big5'))
08/21 03:22, 35F

08/21 03:22, 3年前 , 36F
len('批踢踢'.encode('big5'))
08/21 03:22, 36F

08/21 17:45, 3年前 , 37F
原來可以用big5來計算,又學到一招了。
08/21 17:45, 37F

08/23 00:30, 3年前 , 38F
咦..不是utf8編碼嗎?
08/23 00:30, 38F
文章代碼(AID): #1X7ozt4O (Python)
文章代碼(AID): #1X7ozt4O (Python)