我有一個固定格式的 .txt 檔案:
Tudo Bom;Static and Ben El Tavori;5:13;
I Gotta Feeling;The Black Eyed Peas;4:05;
Instrumental;Unknown;4:15;
Paradise;Coldplay;4:23;
Where is the love?;The Black Eyed Peas;4:13;
我正在嘗試用新名稱替換第三行中的歌曲名稱。
我寫了一個函式my_mp4_playlist,它有兩個引數:第一個是檔案路徑(字串),第二個是新歌名(字串)。
我試圖首先使用read()函式獲取檔案內容,然后回圈檔案行直到第三行并用";".
我的問題是,當我使用該read()功能時,沒有什么可以拆分的,而當我不閱讀時,拆分作業得很好。
代碼(尚未完成)如下所示:
def my_mp4_playlist(file_path, new_song):
with open(file_path, "r ") as f: # we using r for reading and writing and not overriding ALL text in the file
file_source = f.read()
third_line_list = []
for i, line in enumerate(f, 0):
if i == 2:
print(line.split(";"))
third_line_list = line.split(";")
break
列印陳述句的輸出只是什么。但如果我評論該f.read()行,輸出是:
['Instrumental', 'Unknown', '4:15', '\n']
為什么會這樣?我想以更一般的方式了解我的問題,而不是具體的解決方案。
uj5u.com熱心網友回復:
https://pynative.com/python-file-seek/
在大多數編程語言中讀取檔案時,檔案物件維護一個“游標”(也稱為“指標”)以跟蹤檔案中已讀取的部分以及在后續讀取請求中從何處開始讀取。該游標從檔案的第一個位元組開始并向前移動,直到到達檔案末尾。
例如,當您逐行讀取檔案時,檔案物件從游標的當前位置開始,讀取該行,然后將游標移動到它剛剛讀取的行的末尾。當游標到達檔案末尾時,它知道停止讀取。
因此,在您最初呼叫 時f.read(),您正在讀取整個檔案,因此游標位于檔案末尾。在對 的后續呼叫中enumerate (f,0),由于游標位于檔案末尾,因此檔案中沒有任何可讀取的內容,因此有效地跳過了回圈。
當你注釋掉時f.read(),因為你之前還沒有讀過檔案enumerate (f,0),檔案游標停留在檔案的開頭,這就是為什么當你注釋掉時回圈起作用f.read()
如果您需要保留file_source = f.read()(file_source看起來未使用,所以我不確定它的用途)那么您需要在下一次讀取之前將檔案游標重置到檔案的開頭。您可以這樣做,f.seek(0)這會將游標放回檔案中的第 0 個位元組。
或者,由于檔案的全部內容現在都在 中file_source,您不再需要直接從檔案中讀取。
uj5u.com熱心網友回復:
當您打開檔案時,當前讀取位置設定為 0。這里的問題是在您使用 read() 方法讀取檔案的全部內容后,讀取位置移動到檔案末尾。因此,當您嘗試在此列舉器中再次讀取檔案內容時,就沒有什么可讀取的了,因為讀取位置已經在檔案的末尾。
如果您對 read() 方法進行注釋,則在呼叫列舉器時讀取位置仍為 0,因此可以讀取一些內容。
為了解決這個問題,您可以在呼叫列舉器之前使用 seek() 方法重置讀取位置并將其設定為位置 0。
f.seek(0)
for i, line in enumerate(f, 0):
您還可以使用列舉器中的 read() 方法讀取的整個檔案內容,而不是從檔案中讀取它。這是更可取的解決方案,因為您不需要再次從磁盤讀取檔案,而是重用記憶體中已有的內容。這樣的事情應該這樣做:
for i, line in enumerate(file_source.splitlines(), 0):
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/391226.html
