f= open("6.1.txt","r+")
s=f.read(2)
s1=f.readline(2)
s2=f.readlines(0)
print(s)
print(s1)
print(s2)
for line in f:
print(line)
f.seek(2) # 0指標回到檔案開頭 1當前位置 2檔案結尾
f.write("123")
ls=["\n","456","\n","789","\n"]
f.writelines(ls)
f.close()
########## 6.1txt內容 ##################################################
#1.1 one-year-old Harry Potter, after losing his parents, comes to his aunt's house and lives a very painful life.
#1.1 一歲的哈利·波特失去了父母后,便來到了姨媽家,過著極其痛苦的日子。
#1.1 one-year-old Harry Potter, after losing his parents, comes to his aunt's house and lives a very painful life.
#1.1 一歲的哈利·波特失去了父母后,便來到了姨媽家,過著極其痛苦的日子。
問題1:教材上關于檔案讀取方法f.seek(offset)的說明:改變當前檔案操作指標的位置,offset的值:0為檔案開頭;2為檔案結尾。百度f.seek()還有1為檔案當前位置。 為什么在以上代碼中offset的值為2時,指標跑到6.1txt檔案第一行第2個字符的結尾?不是應該在檔案最后一個字符的結尾繼續寫入嗎?
問題2:使用r+,可讀可寫,為什么產生了覆寫寫w的功能?
原本以為使用指標f.seek(2)再寫入一些資料,應該能實作追加寫a的效果,沒想到徹底亂套了。
請大神指點。
uj5u.com熱心網友回復:
在1樓代碼中我發現“\n”占2個字符的位置,又產生了一個新的疑問。#消除一維資料最后一個換行符的其他方法
f = open("1.txt","r")
ls = f.read()
print([ls])
while "\n" in ls:
ls = [ls[0:(len(ls)-1)]]
f.close()
print(ls)
########## 1.1txt內容 ####################################################
#1.1 one-year-old Harry Potter, after losing his parents, comes to his aunt's house and lives a very painful life.\n
在這里len-1就能消除換行符,按照1樓代碼顯示,"\n"占2個字符的位置,為什么不是len-2?
uj5u.com熱心網友回復:
前面的問題我不清楚,洗掉換行符可以用.replace('\n','')字符替換。uj5u.com熱心網友回復:
seek有兩個引數,第一個offset是偏移,第二個引數whence才是你說的從哪里開始偏移uj5u.com熱心網友回復:
我知道replace可以替換。
現在我問的是'\n'占1個字符和2個字符的問題。
uj5u.com熱心網友回復:
百度了offset如何使用,找到如下內容。
>>> f=open("aaa.txt","w") #以只寫的形式打開一個叫做aaa.txt的檔案
>>> f.write("my name is liuxiang,i am come frome china") #寫入內容
41
>>> f.close() #關閉檔案
>>> f=open("aaa.txt","r") #以只讀打開檔案
>>> f.read() #讀取內容
'my name is liuxiang,i am come frome china'
>>> f.seek(3,0) #“0”代表從檔案開頭開始偏移,偏移3個單位
>>> f.read(5) #從偏移之后的指標所指的位置(即“n”)開始讀取5個字符
'name '
>>> f.tell() #顯示現在指標指在哪個位置(即“i”的位置)
8
>>> f.readline() #讀取這一行剩下的內容
'is liuxiang,i am come frome china'
>>> f.seek(0,2) #“2”代表從末尾算起,“0”代表偏移0個單位
41
>>> f.read()
'' #因為是從末尾算起,內容已結束。所以讀取內容為空
在使用seek()函式時,有時候會報錯為 “io.UnsupportedOperation: can't do nonzero cur-relative seeks”,代碼如下:
>>> f=open("aaa.txt","r+") #以讀寫的格式打開檔案aaa.txt
>>> f.read() #讀取檔案內容
'my name is liuxiang,i am come frome china'
>>> f.seek(3,0) #從開頭開始偏移三個單位(偏移到“n”)
3
>>> f.seek(5,1) #想要從上一次偏移到的位置(即“n”)再偏移5個單位
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
io.UnsupportedOperation: can't do nonzero cur-relative seeks
照理說,按照seek()方法的格式file.seek(offset,whence),后面的1代表從當前位置開始算起進行偏移,那又為什么報錯呢?
這是因為,在文本檔案中,沒有使用b模式選項打開的檔案,只允許從檔案頭開始計算相對位置,從檔案尾計算時就會引發例外。將 f=open("aaa.txt","r+") 改成
f = open("aaa.txt","rb") 就可以了
改正后的代碼如下圖:
>>> f = open("aaa.txt","rb")
>>> f.seek(3,0)
3
>>> f.seek(5,1)
8
參考上述代碼,教材上關于檔案讀取方法f.seek(offset)的說明:改變當前檔案操作指標的位置,offset的值:0為檔案開頭;1為檔案當前位置;2為檔案結尾。應該改為f.seek(offset,whence)的說明:改變當前檔案操作指標的位置:offset的值即指標的偏移量;whence的值:0為檔案開頭;1為檔案當前位置;2為檔案結尾。我理解的對不對?
還有2個問題期待大神解答:
問題2:使用r+,可讀可寫,為什么產生了覆寫寫w的功能?
問題3:在1樓代碼中我發現“\n”占2個字符的位置,又產生了一個新的疑問。
#消除一維資料最后一個換行符的其他方法
f = open("1.txt","r")
ls = f.read()
print([ls])
while "\n" in ls:
ls = [ls[0:(len(ls)-1)]]
f.close()
print(ls)
########## 1.1txt內容 ####################################################
#1.1 one-year-old Harry Potter, after losing his parents, comes to his aunt's house and lives a very painful life.\n
在這里len-1就能消除換行符,按照1樓代碼顯示,"\n"占2個字符的位置,為什么不是len-2?
uj5u.com熱心網友回復:
人工置頂,期待解答。uj5u.com熱心網友回復:
問題1: seek的用法錯了,你想移動到結尾,應該是這樣 seek(0, 2),前面指的是偏移量也就是加多少位,后面的2指的是在結尾加,那么在結尾加0就是指標到尾部的意思。修改后代碼無誤問題2:r+ 在實際運行時沒有出現覆寫現象。
uj5u.com熱心網友回復:
你可以用 f.tell() 去看當前指標的位置uj5u.com熱心網友回復:
問題3:\n 確實占兩個位元組,但是len計算的是字符或位元組的長度,\n 被你看到的形式是一個單獨的字符,所以長度為1,但不是位元組為1把 \n 轉換成16進制后再計算可以看到是2位
len('\n'.encode('utf8').hex())
uj5u.com熱心網友回復:
f= open("6.1.txt","r+")
for line in f:
print(line)
f.seek(0) # 0指標回到檔案開頭 1當前位置 2檔案結尾
f.write("\n123")
ls=["\n456","\n789","\n"]
f.writelines(ls)
f.close()
#################6.1文本內容如下###########################
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
運行上述代碼以后:
#################6.1文本變更如下###########################
123
456
789
rstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
我原本以為把指標插入檔案頭,再寫入新資料,會形成后寫入的資料放在前面,原檔案資料在新資料后面這樣的局面。
為什么會形成這樣的局面呢?這個覆寫效果是默認的嗎?教材上沒有提到這些內容。
uj5u.com熱心網友回復:
沒有為什么,規定就是寫到當前指標的位置。不管有沒有存資料都一樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/7076.html
下一篇:小白學習筆記干貨,記得點贊哦!
