iT邦幫忙

1

Python 讀取含中文的 txt 檔問題

  • 分享至 

  • xImage

Python 讀取資料時
一個中文(全形)字與一個文數(半形)字都一樣算1
小弟要讀取其他系統丟來含有中文字的 txt 檔,例如下面這樣的內容

姓名       地址                         電話
---------- ---------------------------- ------------
張三       台北市館前路5號              02-12345678
王大明     台北市中山北路二段321號      (02)87654321
諸葛小明   台北市忠孝東路二段1234號5樓  0987-654321

用一般的文字編輯器看是很整齊的 txt 檔
但用 python 讀取時,就變成長短不一
請問:該如何以 Python 正確解讀含有中文全形字的資料?

看更多先前的討論...收起先前的討論...
饅頭 iT邦新手 4 級 ‧ 2018-04-09 14:14:35 檢舉
你是想要 python 讀檔後做什麼事?
還是單純 print 出來而已?
kjfang iT邦新手 5 級 ‧ 2018-04-09 15:12:48 檢舉
回饅頭大大:
要在解讀後,依欄位資料更新或寫入資料庫。
其中有些數字欄位還要用來計算,若欄位切錯了,就會影響計算結果。
froce iT邦大師 1 級 ‧ 2018-04-09 17:24:26 檢舉
建議你用re.split或是re.findall來做,根本不用管字數又快。
kjfang iT邦新手 5 級 ‧ 2018-04-09 18:32:20 檢舉
回froce大大:
傳來的資料檔是連續的,中間沒有固定的空格或是其他符號,無法用re.split切。
同理,無法用 re.findall 搜尋哪個特定字。
貼一段收到的資料如下:
99994071100666 000000000009958000000000332.170029.9800020171201全形中文VIATION(MJE001)#JETEX 201710063
weiclin iT邦高手 4 級 ‧ 2018-04-09 19:35:59 檢舉
為什麼你收到的資料跟你上面貼的例子差這麼多..
froce iT邦大師 1 級 ‧ 2018-04-09 19:58:43 檢舉
拜託拿跟正式資料像一點的例子出來好嗎?這樣寫出來也不知道是不是你要的。

另外請去看正規表示法\S代表什麼。
findall版本:https://ideone.com/ByBDO7
split版本:https://ideone.com/1szyTo
kjfang iT邦新手 5 級 ‧ 2018-04-09 20:42:44 檢舉
感謝兩位大大的回應:
很抱歉,無法提供正式資料......
但重點就是,我想要用 Python 依固定的位置去切收到的txt檔,卻因為中文的問題,導致無法順利抓到中文後面的資料。
我之前做的例子,為閱讀方便,欄位間以空白隔開,而froce大大要我用 re 去切。所以後面才特別說明:
實際的資料是中、英、數字混在一起,且中間沒有特殊字元或空白(數字欄位未填滿前面補0、文字欄位若未填滿,後面補空白)。
其實,若欄位之間有固定的間隔字元,用csv來讀或許比用 re 要方便些。

目前小弟有一個比較麻煩的想法:
1.用 '字串'.encode('utf-8') 轉換後
2.再去計算有幾個 '\x' ,把這數字除以3,就可以知道整個字串裡面有幾個中文字
3.再依格式說明書中該欄位的長度,減去中文字數讀取。應該可以讀取到正確的資料。

只是覺得上面的步驟有點笨,所以上網來請教各位高手,是否有更好的方法。
weiclin iT邦高手 4 級 ‧ 2018-04-09 20:48:18 檢舉
簡單來說, 你的文字格式就是以一個或多個半形空白分隔的資料嘛? 加上 "資料中間沒有空白" 這一點, 樓上 froce 已經給你解法了
kjfang iT邦新手 5 級 ‧ 2018-04-09 20:48:56 檢舉
其實這種資料格式的傳遞
在早期 COBOL 是很常見的。
另一個小弟不是很想用的方法就是
先寫一個 COBOL 程式把收到的 txt 檔
依格式轉換為 csv 檔案後
再丟給 Python 處理。
但還要在電腦裡面灌 COBOL 環境,太麻煩了。
kjfang iT邦新手 5 級 ‧ 2018-04-09 20:54:48 檢舉
回 weiclin 大大:
空白字元只會出現在文字欄位,且文字未填滿時,後面補空白。
當中間連續的兩個文字欄位,且都被填滿時,還是有無法切的問題。
froce iT邦大師 1 級 ‧ 2018-04-09 20:57:18 檢舉
你丟幾筆資料,包含各種狀況,做點假處理不就好了。
你這樣想幫也不好幫你啊。
而且這樣看起來你的資料欄位其實是固定長度去切的?只是有補空白和補0的狀況?
kjfang iT邦新手 5 級 ‧ 2018-04-09 21:08:58 檢舉
回 froce 大大:
的確收到的 txt 檔案是需要按固定長度去切。
現在的問題就是:遇到中間有中文字或全形字,導致後面的欄位切出來的值有誤。
至於做幾筆假資料的問題,我現在手邊沒有資料可修改,明早我到辦公室改幾筆資料再給您看看。
kjfang iT邦新手 5 級 ‧ 2018-04-09 21:12:02 檢舉
數字前面補0,這個沒問題。
文字後面補空白,是不管中英文(全半形),後面都是補半形的空白字元。有時候同一欄位還會有中英文夾雜。
ccchiou iT邦新手 5 級 ‧ 2018-04-10 19:38:06 檢舉
以前用vb處理相同檔案時也有相同問題,這應該是把big5當成uni code讀取時,所產生的副作用,那時採的策略是
1.整列讀取後轉big5
2.切字串,逐欄轉回Unicode
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

3
froce
iT邦大師 1 級 ‧ 2018-04-09 23:00:29
最佳解答

https://ideone.com/4qGQrV
假設你第一個欄位是8,第2個是4

參考資料

說真的,你問題表達的好的話,可能早就解決了,你原來的問題根本跟你想解的不一樣啊。
你想要的根本就是slice,只是要對big5的bytes實例作slice而已。

kjfang iT邦新手 5 級 ‧ 2018-04-11 16:59:42 檢舉

froce大大:
非常感謝您,這正是我要的。
之前我是直接用 slice,但遇到中文就縮短了,無法精確的計算byte數,所以才會上網發問。
很抱歉,發問時,在語意表達上,讓您誤解了。

0
fuzzylee1688
iT邦研究生 3 級 ‧ 2018-04-12 10:55:33

先寫個外部程式如用C/C++ or C#程式用來處理來源檔 中文內碼切byte(看要加分割符號)做處理.. 再用Python把檔案引用進來即可.
如何呼叫可參考這個.
https://docs.python.org/2/extending/extending.html

froce iT邦大師 1 級 ‧ 2018-04-13 15:17:18 檢舉

...這狀況還用不到這麼麻煩吧?哈

我要發表回答

立即登入回答