查看完整版本: 關於Python分割文件無法執行,麻煩有空的前輩指點
頁: [1] 2

chialewang 發表於 2019-8-29 06:54 PM

關於Python分割文件無法執行,麻煩有空的前輩指點

本帖最後由 chialewang 於 2019-8-29 07:02 PM 編輯

各位前輩 您們好:
程式碼

此程式碼雖然大部分還看不太懂
但有依照教學範例去keyin它
同時也檢查過了,內容應該無誤
但系統卻顯示錯誤
SyntaxError: invalid syntax

我有附加原始檔案
它應該會分割成6個檔案的.txt檔

麻煩有空的前輩 可以指點我一下
先讓程式可以跑成功
不會的之後再發問  感恩

教學範例


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

tryit244178 發表於 2019-8-30 09:21 AM

本帖最後由 tryit244178 於 2019-8-30 09:22 AM 編輯

錯誤訊息裡面有寫,錯在第15行。你再檢查一下

chialewang 發表於 2019-8-30 09:39 PM

tryit244178 發表於 2019-8-30 09:21 AM static/image/common/back.gif
錯誤訊息裡面有寫,錯在第15行。你再檢查一下

tryit244178 前輩 您好:

我對照過很多次了,雖然它顯示15行有問題
但就是不知錯在哪裡


感恩回復

ddttdtxb 發表於 2019-8-30 09:45 PM

本帖最後由 ddttdtxb 於 2019-8-30 09:45 PM 編輯

看懂程式是在作什麼的,覺得怪怪的。
就把要解析的東西,或是解析的結果印出來… 多用 print 。
反正修完的再刪掉就好。

看懂程式很重要,所以講第二遍。
除了樓上提到的第一個錯誤…  (基本語法不熟)
另外有許多地方 "."(英文句號) 和 "_"(底線) 打錯了,
因為這兩符號在鍵盤上的位置離很遠,除非樓主鍵盤比較特殊。
不然應該是程式沒讀懂,照打程式碼的時候看錯了。

相信你你改完之會有所發覺,成長。

對了… 最後補一點。
你解析文件,冒號是全形 "︰" ,
但是程式碼的符號是半形 ":" 。 (我故意上下排,比較看得出是不同東西)
這點可能比較難找到,要被它搞過幾次的人才有感覺…

曾經有一段時間流行一個笑話…
要嚇一個軟體工程師,只要小聲在他的耳邊說…
「你的程式碼裡有個全形空白~~~」
(有點冷…  但是被搞過的人會心有戚戚焉…)
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chialewang 發表於 2019-8-31 05:45 PM

ddttdtxb 發表於 2019-8-30 09:45 PM static/image/common/back.gif
看懂程式是在作什麼的,覺得怪怪的。
就把要解析的東西,或是解析的結果印出來… 多用 print 。
反正修完的 ...

ddttdtxb 前輩 您好:

我重新看了一遍教學
也把"_"、"." 看錯的地方改掉
該+":"的也+了
您說的半形部分我也更換
但還是出現莫名其妙的錯誤

line 22, in split_file
for each_line in f:

我對照過數遍,真的找不出這裡錯誤的原因
但這是處於我在spyker撰寫的模式

我在這裡已經成功將文檔分割出

不知為何會這樣?
還望前輩指點  感恩


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

ddttdtxb 發表於 2019-8-31 06:41 PM

line 22, in split_file
for each_line in f:除了這個之外,應該還有其它的紅字吧!  不要讓人猜錯誤訊息…

難不成… 真的遇到傳說中的「全形空白」了嗎? XD

chialewang 發表於 2019-9-1 07:05 PM

ddttdtxb 發表於 2019-8-31 06:41 PM static/image/common/back.gif
除了這個之外,應該還有其它的紅字吧!  不要讓人猜錯誤訊息…

難不成… 真的遇到傳說中的「全形空白」了 ...

ddttdtxb 前輩 您好:

附上圖檔



我搞不清楚的是在網站就可以,但在spyker就不行
還請您指點 感恩

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

tryit244178 發表於 2019-9-2 09:20 AM

本帖最後由 tryit244178 於 2019-9-2 09:30 AM 編輯

最下面有UnicodeDecodeError的錯誤訊息…
詳細請參考https://www.ptt.cc/bbs/Python/M.1380034106.A.553.html

這的確也是一種另類的全形空白www

chialewang 發表於 2019-9-3 11:12 AM

tryit244178 發表於 2019-9-2 09:20 AM static/image/common/back.gif
最下面有UnicodeDecodeError的錯誤訊息…
詳細請參考https://www.ptt.cc/bbs/Python/M.1380034106.A.553.ht ...

tryit244178 前輩 您好:

所以照文章看來
問題是出在 record.txt 的編碼方式囉?
是嗎? 還望您指點 感恩

chialewang 發表於 2019-9-3 11:23 AM

頭痛><
看了一個多小時的文章
https://www.ptt.cc/bbs/Python/M.1380034106.A.553.html
還是不知怎麼解決?{:38:}{:38:}{:38:}<br><br><br><br><br><div></div>

chialewang 發表於 2019-9-5 10:34 AM

ddttdtxb、tryit244178 前輩 您們好:

我用記事本打開另存新檔
發現它原本就是UTF-8
我再存一次,還是不行
怎麼會這樣?

不好意思 讓各位前輩費心了

chialewang 發表於 2019-9-5 04:14 PM

本帖最後由 chialewang 於 2019-9-5 04:16 PM 編輯

tryit244178 前輩 您好:

還是不行耶!顯示
Reloaded modules: colorama, colorama.initialise, colorama.ansitowin32, colorama.ansi, colorama.winterm, colorama.win32

而且我另在網站測試
結果少了兩個檔案
boy_3.txt 與 girl_3.txt
https://repl.it/@jialiangwang110/UnconsciousWildRuntimeenvironment

難道我電腦犯太歲 = =|||

還望前輩指教 感恩


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

tryit244178 發表於 2019-9-6 09:05 AM

本帖最後由 tryit244178 於 2019-9-6 09:38 AM 編輯

這好像是不同的問題,試試這個:https://www.twblogs.net/a/5c67c900bd9eee01cc9e17f7
這麼說來,你開課了嗎?

chialewang 發表於 2019-9-7 12:01 PM

本帖最後由 chialewang 於 2019-9-7 12:06 PM 編輯

tryit244178 發表於 2019-9-6 09:05 AM static/image/common/back.gif
這好像是不同的問題,試試這個:https://www.twblogs.net/a/5c67c900bd9eee01cc9e17f7
這麼說來,你開課了 ...
tryit244178 前輩 您好:

終於成功了!!!

我加上 f = open('record.txt',"r",encoding="utf-8")
並且把設定改掉
結果真的順利的跑出分割的檔案

只是我不了解的是
為何原本寫 f = open('record.txt') 就可以
但卻要改成 f = open('record.txt',"r",encoding="utf-8")
那是不是每次要寫入檔案
都必須多了這一行 ,"r",encoding="utf-8"?
還有,為何在 Repl.it 卻不用加?


真的很感謝前輩耐心的指導、幫我找資料
感恩

接下來就可以慢慢來研究它為何這麼寫的了


至於課程,還沒開課
我是排1-6晚間的時間
但因為這時間的python已經在上了
所以要等python2的課程結束才會開python1的課程

反正也不急,這陣子我都在YOUTUBE看線上教學
好讓自己先多學一點
如果開始上python的課,那就時間開始倒數三年
三年內補習班可以讓你上多次的python課程
但想一想,這對我來說不划算
畢竟除了python我還可以免費上其他的課程
像是PHP、WORD、EXCEL........等
同時也可以考證照

雖說三年,但看補習班安排課程的進度
我想也上不到幾次


再次謝謝前輩的指導 感恩{:54:}

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ddttdtxb 發表於 2019-9-7 06:40 PM

本帖最後由 ddttdtxb 於 2019-9-9 10:09 PM 編輯

前幾天狀況比較差… 就沒回覆了… (不久剛換工作… 融入新開發流程… 滿燒腦的…)

看到又是一個「書本上不見得會教的東西」,也算滿難得的經驗吧!
以下這段有點長… 算是電腦發展的歷史,有不少的地方是由我自己想像補完的。
所以如果有人發現有錯的地方,就指正一下囉~  (我不是,目前也沒有作電腦歷史學長的想法)

以 0, 1 為基礎的電腦,使用 8 個位元來記錄文字。8 個位元(bit)…也叫 1 位元組(1 byte)。
所以能夠表現的文字數量為 2 的 8 次方,也就是 256 個(0 ~ 255) → ASCII 編碼。
在 C 語言裡面,有個型態叫作字元(char),就代表這種東西…
因為骨子裡是數字,所以可以被作加減運算…  

以 ASCII 的內容,對文字處理上相對簡單,每一個位元就代表著一個字,
解析上容易,儲存上也省空間,但是能夠表現的文字受限,也就是不夠多。
所以後來被採用的其中一種作法,就是多加一個位元來表示,變成「雙位元」文字。
雙位元文字,印象中就不能(或不適合)以 C 語言的 char 處理。
(話說… 常見的高階語言,其實把文字處理包起來,不太需要處理到字元就是了)

在中文輸入法中,有全形和半形文字之分。
在早期的文字編碼中,可以把半形視為單位元,全形視為雙位元。

兩個位元組,也就是 16 bit ,理論上可以提供 2 的 16 次方,也就是 65536 種組合。
不過由於得讓電腦得以識別接下來的文字是單位元,還是雙位元。所以實際組合沒那麼多。
印象中,中文常用文字好像就 6 萬多個,在台灣這邊,是取較常用的 4 萬多個字出來。
這個編碼叫作 BIG5 ,也有人叫它「大五碼」。而大陸那裡也有自己幾套,名稱多是 GB 開頭。

因為在那個年代,記憶體是很貴的東東,所以不管在哪個方面,使用上都得很省很省。
所以既使知道雙位元仍然不足以把所有的中文字塞進去,但仍然只用雙位元來表示。
折衷的方法,就是不把所有的組合用完,保留一部未定義的空間,讓有需要的人去增加。
未被包含進去的文字,被歸類為罕用字,許多的時候出現在人名,事物名稱上。
所以早期的 window 裡還有內建造字程式,早期銀行為了能記錄客戶的姓名,也得自己造字。
而字型商(字造完總是要顯示、列印出來)也有因此提供的一些「解決方案」。

冷知識,所以早期銀行之間的資料,不能互通。因為同一個文字碼,在另一家銀行可能表示另一個文字。

網際網路的出現,讓使用不同語系的使用者,可能會開使用不用編碼的網站。
網頁 html 內容中,需要在一開始宣告這個檔案使用的編碼,免得出錯。造成結果為「亂碼」…
所以宣告網站使用編碼的地方,前面最好不要有非 ASCII 能表現的文字,否則可能會出錯。
至今,這個宣告仍然是 html 中很重要的部分。

終於來到了近代,電腦變強了,記憶體變多了。
在一個網頁中(或文件)中使用到多國文字的需求也越強。
雖然中間出現過把平、片假名加到罕用字,想讓日文、中文能用一套編碼表示的作法。
不過需要顯示的文字數量太多,仍然不夠放。

所以後來就有人提出「萬國碼」也就是 unicode 。概念上就是任何一個文字,
都能夠 unicode 中有一個獨立的編碼,讓不同語系的文字分開,不會重覆使用編碼。
如此理論上,就可以顯示這世界上,甚至是未來新出現的文字…
然後問題就會變成… 電腦裡的字型檔,顯不顯得出這個文字。
(有些時候電腦,或網頁出出現種俗程 叉燒包 "☒" 的東東,就是因為字型沒這個字的關係)

萬國碼依照解析方式,有分不同的版本。
而常見的 UTF-8 ,是一種可能由 1 ~ 6 個位元組的編碼方式,並不像早期固定雙位元。
所以全形字的定義,得被改為「多位元」而非雙位元了。
至於詳細的計算方式,大多內建在多種程式語言中,一般撰寫程式上不用自己去算。

回到主題上,由於程式裡,解析的資料中,可能會出現多位元的內容。
所以如果在解析資料的時候,採用錯誤的規則,那文字就會解析失敗。
如果是出現在被讀入分析的資料上,就會像這次樓主遇到的拆文字失敗的狀況。
如果是出現在程式內容,就會發生程式解析或編譯失敗。
這也是「全形空白」這種肉眼看不見的,但在程式解析上造成不合法的字元,
讓人很頭痛的原因。

現在瀏覽器很強大,當你貼文字上去的時候,會自動把你的編碼,
轉成網站所宣告的那一種,所以有時候遇到編碼問題的程式,貼到網路上就正常。
就是這個原因,因為本來有的編碼問題,在貼上的時候被處理掉了。
在本機的文字編輯器,就得注意存檔所使用的編碼。
不過現在不要太舊的文字編輯器(不含記事本這種),預設多半是 UTF-8 了,所以遇到問題的機會就更小了。

電腦目前常見的作業系統分為兩類,微軟的 window 一派與 UNIX-like 一派(linux, mac)。
UNIX-like 在很早之前就轉到 UTF-8 的陣營了,所以問題比較少一些。
而 window 則是由一堆歷史因素,以及得向前相容,現在還並非真正使用 UTF-8 編碼。
而 CP950 ,實際上並非特定一種編碼方式,它是代表「當下系統預設的文字編碼」
在繁中的電腦上,可能與 BIG5 編碼等義,而大陸的可能是 GB 編碼。

樓主遇到的狀況,就是程式以系統預設的編碼(CP950, 可能是 BIG5)讀,
但是檔案從一開始就是 UTF-8 的編碼格式,所以結果當然就是解析失敗囉~~
而網站上,大多都是 linux 基底(UTF-8),貼上資料時也轉 UTF-8 過,所以不會出事。

這種問題個人的觀點… 在最近幾年內的 windows 系統下,可能不會真正轉到 UTF-8 。
所以在 windows 系統下讀取帶多位元資料的檔案,最好統統都指定編碼,是最保險的作法。

(本來以為短短可以寫完… 沒想到打了長長的一大篇…)...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>
頁: [1] 2