08-Python文件處理

08-Python文件處理

一、打開關閉文件

可以用 file 對象做大部分的文件操作。 file()在python3中已經被廢除,使用open()打開文件

open 函數
先用open()打開一個文件,創建一個file

對象,再用相關方法才可以調用它進行讀寫。

語法

file object = open(file_name [, access_mode][, buffering]) 

參數說明
file_name:
file_name變量是一個包含了你要訪問的文件名稱的字符串值。

access_mode:
決定打開文件的模式:只讀’r’,寫入’w’,追加’a’等,所有可取值見后面的完全列表,這個參數是非強制的,默認文件訪問模式為只讀?。

buffering:
如果buffering值被設為0(python3已經不能使用0了),就不會有寄存,數據會立即寫入文件。
如果buffering值取1(默認值),訪問文件時會寄存行,直到文件關閉才會把數據同步到文件。一般緩沖使用系統默認值即可.
如果將buffering的值設為大于1的整數,表明這就是的寄存區的緩沖大小。緩沖內容超過這個大小之后就會同步硬盤
如果取負值,寄存區的緩沖大小則為系統默認。

例1.
>>> f = open(‘c.txt’,‘w’,0) #沒有緩沖
>>> f.write(‘hello world’) #close之前打開另一終端觀察文件發現已經寫入進去,說明關閉文件之前就已經寫到硬盤
>>> f.close()

例2.
? >>> f = open(‘d.txt’,‘w’,1) #有緩沖
? >>> f.write(‘hello world’) #close之前打開另一終端觀察文件發現沒有寫入進去,說明關閉文件之前沒有寫到硬盤
? >>> f.close()
?

不同模式打開文件的完全列表

模式描述
r以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。以這種模式打開的文件必須是已經存在的(U模式也是)
rb以二進制格式打開一個文件用于只讀。文件指針將會放在文件的開頭。這是默認模式。
r+打開一個文件用于讀寫。文件指針將會放在文件的開頭。注意這個模式默認是帶緩沖的
rb+以二進制格式打開一個文件用于讀寫。文件指針將會放在文件的開頭。
w打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
wb以二進制格式打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
w+打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
wb+以二進制格式打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
a打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后即使你 seek 到了其它的地方。如果該文件不存在,創建新文件進行寫入。
ab以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
a+打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用于讀寫。
ab+以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用于讀寫。

通用換行符支持(UNS):
還有一個特殊的模式U,不同平臺用來表示行結束的符號是不同的, 例如 \n, \r, 或者 \r\n.當你使用 ‘U’ 標志打開文件的時候, 所有的行分割符(或行結束符, 無論它原來是什么)通過 Python 的輸入方法(例如 read*() )返回時都會被替換為換行符 NEWLINE(\n).注意 UNS 只用于讀取文本文件. 沒有對應的處理文件輸出的方法.

可以使用U,rU或Ua模式打開文件

關于 ‘b’ 的說明
對于所有 POSIX 兼容的 Unix 系統(包括Linux)來說, 'b’是可有可無的, 因為它們把所有的文件當作二進制文件, 包括文本文件.
下面是從 Linux 手冊的 fopen() 函數使用中摘錄的一段, Python 語言中的 open() 函數就是從它衍生出的:
指示文件打開模式的字符串中也可以包含字符 “b” , 但它不能做為第一個字符出現.
這樣做的目的是為了嚴格地滿足 ANSI C3.159-1989 (即 ANSI C)中的規定。
事實上它沒有任何效果, 所有POSIX 兼容系統, 包括 Linux , 都會忽略 “b” ,其它系統可能會區分文本文件和二進制文件, 如果你要處理一個二進制文件, 并希望你的程序可以移植到其它非 Unix 的環境中, 加上"b" 會是不錯的主意

擴展閱讀:

計算機在物理內存上面存放的都是二進制,所以文本文件和二進制文件的主要區別是在邏輯上的而不是物理上的。而從文件的編碼方式來看,文件可以分為文本文件和二進制文件。文本文件是基于字符編碼的文件,常見的有ASCII、Unicode等,二進制文件是基于值編碼的文件,可以看成是變長編碼,你可以根據自己的需要,決定多少個比特代表一個值。從文件編碼的方式來看,文件可分為ASCII碼文件和二進制碼文件兩種。
(1)ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符對應一個字節,用于存放對應的ASCII碼。例如,數5678的存儲形式為:ASC碼:    00110101 00110110 00110111 00111000↓      ↓     ↓      ↓      十進制碼:  5      6     7     8 共占用4個字節。ASCII碼文件可在屏幕上按字符顯示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內容。 由于是按字符顯示,因此能讀懂文件內容。(2)二進制文件是按二進制的編碼方式來存放文件的。 例如, 數5678的存儲形式為: 00010110 00101110只占二個字節。二進制文件雖然也可在屏幕上顯示,但其內容無法讀懂。C系統在處理這些文件時,并不區分類型,都看成是字符流,按字節進行處理。 輸入輸出字符流的開始和結束只由程序控制而不受物理符號(如回車符)的控制。 因此也把這種文件稱作“流式文件”。存儲的方式不同二進制文件就是把內存中的數據按其在內存中存儲的形式原樣輸出到磁盤中存放,即存放的是數據的原形式。文本文件是把數據的終端形式的二進制數據輸出到磁盤上存放,即存放的是數據的終端形式在實際存儲中最好是將數據分成字符數據和非字符數據兩類:(1)如果存儲的是字符數據,無論采用文本文件還是二進制文件都是沒有任何區別的,所以討論使用文本文件還是二進制文件是沒有意義的。(2)如果存儲的是非字符數據,又要看我們使用的情況來決定:a:如果是需要頻繁的保存和訪問數據,那么應該采取二進制文件進行存放,這樣可以節省存儲空間和轉換時間。b:如果需要頻繁的向終端顯示數據或從終端讀入數據,那么應該采用文本文件進行存放,這樣可以節省轉換時間。文本文件的打開方式和二進制文件打開方式的區別
(1)文本模式中回車被當成一個字符'\n',在文件中如果讀到0x1B,文本模式會認為這是文件結束符,會按照一定方式對數據做相應的轉換。
(2)二進制模式中'\n'會被認為是兩個字符0x0D,0x0A;在讀到0x1B時,二進制模式不會對文件進行處理。只讀/寫模式的r/w和rb/wb
(1)r:讀取到的是文本數據(字符的編碼),使用 open() 打開文件時,默認采用 GBK 編碼。但當要打開的文件不是 GBK 編碼格式時,可以在使用 open() 函數時,手動指定打開文件的編碼格式,例如:file = open("a.txt",encoding="utf-8")(2)rb: 讀取到的是二進制數據(字符在硬盤中存儲的二進制),不需要指定編碼.

file對象的屬性
一個文件被打開后,你就會擁有一個file對象,你可以得到有關該文件的各種信息。

file對象屬性列表:

屬性描述
file.closed如果文件已被關閉返回true,否則返回false。
file.mode返回被打開文件的訪問模式。
file.name返回文件的名稱。

例:

#!/usr/bin/python3.8
# 打開一個文件
fo = open("foo.txt", "w")
print("文件名: ", fo.name)
print("是否已關閉 : ", fo.closed)
print("訪問模式 : ", fo.mode)輸出結果: 
文件名:  foo.txt
是否已關閉 :  False
訪問模式 :  w

close()方法
File 對象的 close()方法刷新緩沖區里任何還沒寫入的信息,并關閉該文件,這之后便不能再進行寫入。

語法:
fileObject.close()
例:

#!/usr/bin/python3.8
fo = open("foo.txt", "w")
print("文件名: ", fo.name)
fo.close()      # 關閉打開的文件輸出結果: 
文件名:  foo.txt 

with

用with可以不用關閉文件

with open(‘/proc/meminfo’) as fd: 和 fd=open(‘/proc/meminfo’) 執行的結果一樣,都是遍歷文件;
后者當打開的文件達到幾個G的時候,很消耗內存,而前者沒有這個問題

#!/usr/bin/env python3.8
with open('a.txt','w') as f:f.write('hello world')with open('a.txt','r') as f:print(f.read())

二、讀文件

使用方法:read() readline() readlines()

read():返回字符串
從一個打開的文件中讀取一個字符串。
fileObject.read([count])
被傳遞的參數count是要從已打開文件中讀取的字節計數。
該方法從文件的開頭開始讀入,如果沒有傳入count參數(默認值為 -1)或者值為負, 文件將被讀取到末尾.

#!/usr/bin/python3.8
fo = open("foo.txt", "r+")
str = fo.read(10);
print("讀取的字符串是 : ", str)
fo.close() 輸出結果: 讀取的字符串是 :  www.fklinu

Windows下字符編碼報錯

報錯如下:
Traceback (most recent call last):File "c:/Users/86186/Desktop/python-exc/hello.py", line 3, in <module>str = fo.read(10);
UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence    解決方案:
#!/usr/bin/python3.8
fo = open("foo.txt", "r+",encoding="utf-8",errors="ignore") # 如果在windows下讀文件報錯就加上編碼和錯誤忽略,這里用的utf-8也不合適,最后的結果會有問題,每個字符之間都有個空格
str = fo.read(10);
print("讀取的字符串是 : ", str)
fo.close() #!/usr/bin/python3.8
fo = open("foo.txt", "r+",encoding="utf-16",errors="ignore") # 查看記事本用的字符編碼是utf-16,這樣才能可以讀到正確的內容
str = fo.read(10);
print("讀取的字符串是 : ", str)
fo.close() 

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

readline():返回字符串
讀取下個行結束符之前的所有字節. 作為字符串返回整行,包括行結束符。
和 read() 相同, 它也有一個可選的 size 參數, 默認為 -1, 代表讀至行結束符, 如果提供了該參數, 那么在超過 size 個字節后會返回不完整的行.

readlines():返回字符串列表
讀取所有剩余的行,返回一個字符串列表。

三、寫文件

使用方法:write() writelines()

write()
可將任何字符串(包括二進制數據)寫入一個打開的文件,Linux下不會在字符串的結尾添加換行符(‘\n’),windows是有換行符的,不支持數字

writelines()
是針對字符串序列的操作, 它接受一個字符串序列(字符串,字符串列表,字符串元組)作為參數, 將它們寫入文件. 行結束符并不會被自動加入, 所以如果需要的話, 你必須在調用writelines()前給每行結尾加上行結束符.

語法:
fileObject.write(string)
string參數是要寫入到已打開文件的內容。

#!/usr/bin/python3.8
fo = open("foo.txt", "w")
fo.write("www.fklinux.com!\nVery good site!\n"); 
fo.close() # 關閉打開的文件被創建的foo.txt文件內容: 
# cat foo.txt 
www.fklinux.com!
Very good site!

四、文件指針

tell()
這個方法告訴我們文件內的當前位置,換句話說,下一次的讀寫會發生在文件開頭這么多字節之后。

seek()
可以在文件中移動文件指針到不同的位置.

語法:

seek(offset [,from])

offset

? 表示要移動的字節數

from

? 指定開始移動字節的參考位置。
? 如果from被設為0,這意味著將文件的開頭作為移動字節的參考位置(0 – start of stream (the default); offset should be zero or positive)

? 如果設為1,則使用當前的位置作為參考位置(python2可以,python3必須帶b讀文件–rb)
? 如果設為2,那么該文件的末尾將作為參考位置 (其實唯一的作用是將指針移動到最后seek(0,2))

? seek配置r+模式可以實現從指定位置修改文件

例: 就用上面創建的文件foo.txt

#!/usr/bin/python3.8
# python2沒有任何問題,python3 在seek的時候如果相對位置是1,需要打開文件的是時候帶'b'
fo = open("foo.txt", "r+")
str = fo.read(10);
print ("讀取的字符串是 : ", str)# 查找當前位置
position = fo.tell();
print ("當前文件位置 : ", position)# 把指針再次重新定位到文件開頭
position = fo.seek(0, 0);
str = fo.read(10);
print ("重新讀取字符串 : ", str)
# 關閉打開的文件
fo.close()輸出結果: 讀取的字符串是 :  www.fklinu當前文件位置 :  10重新讀取字符串 :  www.fklinuIn [77]: with open('a.txt','rb') as f:...:     print(f.read(2))...:     f.seek(2,1)  ...:     print(f.read(2))...: 
b'he'
b'o '

五、文件迭代

一行一行訪問文件很簡單:

for eachLine in f::

eachLine 代表文本文件的一行,包括末尾的行結束符
?Python 2.2 中, 引進了迭代器和文件迭代, 文件對象成為了它們自己的迭代器用戶不必調用 read() 方法就可以在 for 循環中迭代文件的每一行.

迭代器之前的老方法
for eachLine in f.readline()::
In [35]: for i in f: 
...:     	print(i,end="")    # end的作用是取消print默認的換行
...:                                                                          1111222233334444

print函數取消默認換行符

print 語句默認在輸出內容末尾后加一個換行符, 而在語句后加一個逗號就可以避免這個行為. readline() 和 readlines() 函數不對行里的空白字符做任何處理,所以你有必要加上逗號. 如果你省略逗號, 那么顯示出的文本每行后會有兩個換行符, 其中一個是輸入是附帶的, 另個是 print 語句自動添加的.

打印輸出的時候取消默認換行,python2只需要在后面加一個逗號’,’

#!/usr/bin/env python
print "hello",   			# 在這里加逗號可以取消換行
print "hi"#!/usr/bin/env python3.8
print("hello",end="")    	# 這是python3里的方法
print "hi"

另外也可使用迭代器的 next 方法, file.next() 可以用來讀取文件的下一行.

注意:python3已經不支持file.next()方法,python3使用系統內置函數next()

和其它迭代器一樣,Python 也會在所有行迭代完成后引發 StopIteration 異常.

In [269]: f=open("a.txt","r+")In [270]: next(f)
Out[270]: 'hello world\n'In [271]: next(f)
Out[271]: 'nice to meet you\n'In [272]: next(f)
Out[272]: 'I love you\n'

六、文件重命名和刪除

創建普通文件

>> os.mknod("/a.txt")

Python的os模塊提供了幫你執行文件處理操作的方法,比如重命名和刪除文件。

rename()方法
語法:
os.rename(current_file_name, new_file_name)

例子: 下例將重命名一個已經存在的文件test1.txt。

#!/usr/bin/env python3.8
import os
os.rename("foo.txt","foo1.txt")          # 重命名文件foo.txt到foo1.txt

remove()方法
刪除文件
語法:
os.remove(file_name)

例子: 下例將刪除一個已經存在的文件test2.txt。

#!/usr/bin/python3.8
import os
os.remove("test2.txt")  # 刪除一個已經存在的文件test2.txt

七、Python目錄操作

os模塊有許多方法能幫你創建,刪除和更改目錄。

mkdir()方法
語法:
os.mkdir(“newdir”)
例子:

#!/usr/bin/python3.8
import os
os.mkdir("test")        # 創建目錄test

chdir()方法
改變當前工作目錄
語法:
os.chdir(“newdir”)
例子: 下例將進入"/home/newdir"目錄。

#!/usr/bin/python3.8
import os
os.chdir("/home/newdir")  # 將當前目錄改為"/home/newdir"

getcwd()方法
顯示當前工作目錄
語法:
os.getcwd()
例子:

#!/usr/bin/python
import os
os.getcwd()  # 給出當前的目錄

rmdir()方法
刪除目錄,只能刪除空目錄
語法:
os.rmdir(‘dirname’)
例子:

#!/usr/bin/python3.8
import os
os.rmdir( "/tmp/test"  )  # 刪除”"tmp/test"目錄

八、Python File方法列表

file 對象使用 open 函數來創建,下表列出了 file 對象常用的方法

方法描述
file.close()關閉文件。關閉后文件不能再進行讀寫操作。
file.flush()刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入。
file.fileno()返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。
file.isatty()如果文件連接到一個終端設備返回 True,否則返回 False。
file.read([size])從文件讀取指定的字節數,如果未給定或為負則讀取所有。
file.readline([size])讀取整行,包括 “\n” 字符。
file.readlines([sizehint])讀取所有行并返回列表,若給定sizeint>0,返回總和大約為sizeint字節的行, 實際讀取值可能比sizhint較大, 因為需要填充緩沖區。
file.seek(offset[,whence])設置文件當前位置
file.tell()返回文件當前位置。
file.truncate([size])截取文件,截取的字節通過size指定,默認為當前文件位置。
file.write(str)將字符串寫入文件,沒有返回值。
file.writelines(sequence)向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。

truncate() 方法
將文件截取到當前文件指針位置或者到給定 size , 以字節為單位.
它接受一個可選的 size 作為參數. 如果給定, 那么文件將被截取到最多 size 字節處. 如果沒有傳遞 size 參數, 那么默認將截取到文件的當前位置.例如, 你剛打開了一個文件, 然后立即調用 truncate() 方法, 那么你的文件(內容)實際上被刪除,這時候你是其實是從 0 字節開始截取的

In [19]: cat foo.txt
aaaaa
bbbbbIn [20]: f = open('foo.txt','r+')  #注意權限必須帶+號In [21]: f.truncate(2)
Out[21]: 2In [22]: cat foo.txt
aa

八、Python序列化數據存儲

序列化 (Serialization)是指將對象、數據結構的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。

我們編寫的程序,會涉及到各種各樣的對象、數據結構,它們通常是以變量的形式在內存中存在著。當程序運行結束后,這些變量也就會被清理。但我們有時希望能夠在下一次編寫程序時恢復上一次的某個對象(如機器學習中的到結果,需要程序運行較長時間,多次運行時間成本太大),這就需要我們將變量進行持久化的存儲。

一種方式是利用文件讀寫的方式將變量轉化為某種形式的字符串寫入文件內,但需要自己控制存儲格式顯得十分笨拙。更好的方式是通過序列化的方式將變量持久化至本地。

json是一種所有的語言都可以識別的數據結構。
如果我們將一個字典或者序列化成了一個json存在文件里,那么java代碼或者js代碼也可以拿來用。
但是如果我們用pickle進行序列化,其他語言就不能讀懂這是什么了
所以,如果你序列化的內容是列表或者字典,非常推薦你使用json模塊
但如果出于某種原因你不得不序列化其他的數據類型,而未來你還會用python對這個數據進行反序列化的話,那么就可以使用pickle

json序列化
json模塊提供了四個功能:
dumps 序列化對象至字符串,存儲到內存

? loads 對應的反序列化方法

? dump 序列化對象至本地文件

? load 對應的反序列化方法

pickle序列化
pickle模塊提供了四個功能:
dumps 序列化對象至字符串,存儲到內存

? loads 對應的反序列化方法

? dump 序列化對象至本地文件

? load 對應的反序列化方法

pickle可以存儲什么類型的數據?

  1. 所有python支持的原生類型:布爾值,整數,浮點數,復數,字符串,字節,None。
  2. 由任何原生類型組成的列表,元組,字典和集合。
  3. 函數,類,類的實例

例子:
pickle模塊

>>> import pickle
>>> data = ['aa', 'bb', 'cc']  

dumps 存儲數據,將數據通過特殊的形式轉換為只有python語言認識的字符串

>>> p_str = pickle.dumps(data)
>>> print(p_str) b'\x80\x03]q\x00(X\x02\x00\x00\x00aaq\x01X\x02\x00\x00\x00bbq\x02X\x02\x00\x00\x00ccq\x03e.

loads 讀取數據,將pickle數據轉換為python的數據結構

>>> mes = pickle.loads(p_str)
>>> print(mes)['aa', 'bb', 'cc']

dump 存儲數據,將數據通過特殊的形式轉換為只有python語言認識的字符串,并寫入文件

with open('/tmp/aa.txt', 'wb') as f:pickle.dump(data, f)

注意:以上代碼中的w必須帶b

load 讀取數據,從數據文件中讀取數據,并轉換為python的數據結構

with open('/tmp/aa.txt', 'rb') as f:data = pickle.load(f)

注意:以上代碼中的r必須帶b

寫入多個對象

In [25]: import pickle
In [26]: li = [1,2,3]
In [27]: di = {'a':'b'}In [28]:  with open('pickles.db','wb') as f:...:     pickle.dump(li,f)...:     pickle.dump(di,f)...: 

讀取多個對象

In [29]: with open('pickles.db','rb') as f:...:     l2  = pickle.load(f)...:     d2 = pickle.load(f)...: In [30]: l2
Out[30]: [1, 2, 3]In [31]: d2
Out[31]: {'a': 'b'}

在有序列化數據的基礎上追加數據

In [2]: import pickle 
In [1]: d={"name":"fulei","age":28,"shengao":18}   # 第一次存儲數據
In [3]: with open("a.txt","wb") as f: ...:     pickle.dump(d,f) In [6]: e={"name":"fulei","age":28,"shengao":18}   In [7]: with open("a.txt","ab") as f: 				# 第一次追加...:     pickle.dump(e,f) In [9]: l={"xingming":"fulei","nianling":27,"gaodu":180}                       In [10]: with open("a.txt","ab") as f:              # 第二次追加...:     pickle.dump(l,f) In [13]: with open("a.txt","rb") as f:    			# 取數據時要按順序取3次...:     e=pickle.load(f) ...:     t=pickle.load(f) ...:     v=pickle.load(f) 
In [14]: e 
Out[14]: {'name': 'fulei', 'age': 28, 'shengao': 18}In [15]: t 
Out[15]: {'name': 'fulei', 'age': 28, 'shengao': 18}In [16]: v 
Out[16]: {'xingming': 'fulei', 'nianling': 27, 'gaodu': 180}

json模塊

In [1]: import jsonIn [2]: s = json.dumps({"a": "b"})In [3]: s
Out[3]: '{"a": "b"}'In [4]: json.loads(s)
Out[4]: {'a': 'b'}
In [5]: import jsonIn [6]: li = [1,2,3]In [7]: di = {'a':'b'}In [8]: with open('json.db','w') as f:...:     json.dump(li,f)  	#序列化存儲列表'li'到文件中...: In [9]: !cat json.db  			#json序列化的文件是直接可讀的
[1, 2, 3]In [15]: with open('json.db','r') as f:...:     l2 = json.load(f) 	#反序列化...: In [16]: l2
Out[16]: [1, 2, 3]

序列化多個對象到文件中

In [20]: with open('json.db','w') as f:...:      f.write(json.dumps(li)+'\n') 	# 需要換行符保證每個對象占一行...:      f.write(json.dumps(di)+'\n') 

從一個文件讀取多個序列化對象時需用 loads 配合readline,一次讀一行

In [21]: with open('json.db','r') as f:...:     l2 = json.loads(f.readline())...:     d2 = json.loads(f.readline())...: In [22]: l2
Out[22]: [1, 2, 3]In [23]: d2
Out[23]: {'a': 'b'}

擴展練習

----編寫程序,實現程序功能為修改指定文件內指定內容

[root@python python]# cat alterfile.py 
#!/usr/bin/env python3
# 程序執行方式:python alterfile.py test.txt 舊關鍵字 新關鍵字
import sys
file_name = sys.argv[1]
old_str   = sys.argv[2]
new_str   = sys.argv[3]def alter(file,old_str,new_str):file_data = ""with open(file,"r") as f:for line in f:if old_str in line:line = line.replace(old_str,new_str)file_data += linewith open(file,"w") as f:f.write(file_data)alter(file_name,old_str,new_str)[root@python python]# cat test.txt
hello world
nice to meet you
nihao every body[root@python python]# python alterfile.py test.txt world 世界[root@python python]# cat test.txt
hello 世界
nice to meet you
nihao every body
[root@python python]# cat alterfile.py 
#!/usr/bin/env python3
# 程序執行方式:python alterfile.py test.txt 舊關鍵字 新關鍵字
import sys
file_name = sys.argv[1]
old_str   = sys.argv[2]
new_str   = sys.argv[3]def alter(file,old_str,new_str):file_data = ""with open(file,"r") as f:for line in f:if old_str in line:line = line.replace(old_str,new_str)file_data += linewith open(file,"w") as f:f.write(file_data)alter(file_name,old_str,new_str)[root@python python]# cat test.txt
hello world
nice to meet you
nihao every body[root@python python]# python alterfile.py test.txt world 世界[root@python python]# cat test.txt
hello 世界
nice to meet you
nihao every body

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87754.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

增強現實—Multimodal text style transfer for outdoor vision-and-language navigation

&#x1f31f;&#x1f31f; 歡迎來到我的技術小筑&#xff0c;一個專為技術探索者打造的交流空間。在這里&#xff0c;我們不僅分享代碼的智慧&#xff0c;還探討技術的深度與廣度。無論您是資深開發者還是技術新手&#xff0c;這里都有一片屬于您的天空。讓我們在知識的海洋中…

黑馬程序員新版Linux學習筆記——第二部分 基礎命令

一、Linux目錄結構 二、命令基礎 三、ls 列目錄內容 3.1 命令 3.2 參數 3.3 總結 四、cd 切換工作目錄 4.1命令 五、pwd 查看當前工作目錄 5.1命令 六、相對路徑、絕對路徑、特殊路徑符 七、mkdir 創建目錄命令 7.1命令 八、touch、cat、more 文件操作命令 8.1 touch 8.2c…

日常運維問題匯總-25

76.銷售訂單交貨單狀態更新 實務中偶有發生交貨已完成&#xff0c;無需開票或開票已經完成&#xff0c;交貨單狀態為&#xff1a;處理中&#xff0c;且仍然出現在VF04中&#xff0c;如下圖所示&#xff1a; 解決方法&#xff1a; T-CODE:VL_COMPLETE,可對錯誤的DN狀態進行更新…

【2025 年】軟件體系結構考試試卷-期末考試

2025 年軟件體系結構考試試卷 考試學期&#xff1a;2025 考試形式&#xff1a;閉卷 考試時間&#xff1a;120 分鐘 年級&#xff1a;______ 專業&#xff1a;軟件工程 班級&#xff1a;______ 一、單選題&#xff08;每小題 1.5 分&#xff0c;共 24 分&#xff09; 關于策略…

4.查看、刪除數據庫

1.顯示所有數據庫 SHOW DATABASE 2.顯示數據庫創建語句 SHOW CREAT DATABASE db_name 例如想查看某個數據庫是怎樣創建的&#xff0c;用的什么字符集啥的。 3.數據庫刪除語句【慎用】 DROP DATABASE [IF EXISTS] db_name 刪除某個數據庫之前一定要確定是否進行了備份。

設計模式 - 原型模式

原型模式&#xff08;Prototype&#xff09;&#xff0c;在制造業種通常是指大批量生產開始之前研發出的概念模型&#xff0c;并基于各種參數指標對其進行檢驗&#xff0c;效果達到了質量要求&#xff0c;即可參照這個原型進行批量生產。即&#xff0c;原型模式可以用對象創建對…

MySQL數據庫基礎:從零開始的第一步【Linux】

前言 各位小伙伴們&#xff0c;好久不見&#xff01;近期&#xff0c;我的文章更新頻率確實有些緩慢&#xff0c;在此誠摯地向大家道歉。這個月是我的期末考試月&#xff0c;正處于緊張的復習&#xff08;也可以說是重新學習&#xff09;階段。盡管學業繁忙&#xff0c;但我依然…

502 Bad Gateway:服務器作為網關或代理時收到無效響應處理方式

502 Bad Gateway 錯誤是 Web 開發和服務器管理中常見的問題&#xff0c;通常表示網關或代理服務器收到無效響應。這種錯誤可能由多種原因引起&#xff0c;包括后端服務故障、網絡問題或配置錯誤等。了解502錯誤的原因及其處理方式&#xff0c;對于維護網站的可用性和用戶體驗至…

Abel 變換,離散型分部積分

文章目錄 零、引入&#xff1a;分部積分一、Abel 變換1.1 Abel 變換1.2 證明 二、一些比較淺顯的應用2.1 等差 乘 等比型求和2.2 平方求和公式2.3 不等式證明 三、一些算法題的式子優化3.1 3500.將數組分割為子數組的最小代價3.2 D. Array Splitting3.3 300. 任務安排1 零、引入…

火山 RTC 引擎12----合流轉推 集成

一、火山、網易 合流轉推集成 1、 首次先要startPush,要不然,推不了流 void NRTCEngine::PushToCDN(std::string taskID, std::string url) {if (m_video == nullptr) return;bytertc::IMixedStreamConfig* config = getMixedStreamConfig(url);int ret = m_video->star…

基于STM32設計的物聯網疫苗冷鏈物流監測系統

文章目錄 一、前言1.1 項目介紹【1】項目開發背景【2】設計實現的功能【3】項目硬件模塊組成【4】設計意義【5】國內外研究現狀(1)國內研究現狀(2)國外研究現狀(3)技術演進趨勢分析(4)現存技術缺口(5)關鍵案例技術對比表【6】摘要1.2 設計思路1.3 系統功能總結1.4 開…

音頻中采樣率和幀是什么?怎么理解?

視頻中的“幀”是指一張圖片&#xff0c;那么在音頻中&#xff0c;“幀”的含義就完全不同了。理解音頻中的“幀”概念&#xff0c;對做音視頻處理、流媒體開發非常關鍵。 一、聲音是怎么采集的&#xff1f; 音頻采集是指通過麥克風等設備捕捉周圍環境中的聲波&#xff0c;并…

第三方檢測護航軟件登記:企業合規的技術通行證與市場信任基石

一、軟件產品登記測試&#xff1a;合規化的必經之路 根據《軟件產品管理辦法》&#xff0c;所有上市軟件必須通過第三方檢測機構的專業評估&#xff0c;確保功能、性能、安全性等指標符合國家標準&#xff08;如GB/T 25000系列&#xff09;。這一強制性要求不僅規避了法律風險…

產品頁不被收錄的6個技術原因(非重復內容/爬蟲限制類)

頁面未被收錄的原因可能藏在代碼架構或服務器配置中 比如爬蟲無法“看懂”你的動態內容&#xff0c;或是某個參數設置錯誤導致頁面被判定為重復。 本文從技術排查角度出發&#xff0c;整理6個最易被忽視但直接影響收錄的實操問題。 頁面加載速度拖慢爬蟲抓取 例如&#xff0…

如何在FastAPI中打造一個既安全又靈活的權限管理系統?

title: 如何在FastAPI中打造一個既安全又靈活的權限管理系統? date: 2025/06/16 08:17:05 updated: 2025/06/16 08:17:05 author: cmdragon excerpt: FastAPI權限系統通過依賴注入實現三級驗證:身份認證、角色驗證和權限校驗。數據庫模型包括用戶、角色和權限注冊表,支持…

通過Radius認證服務器實現飛塔/華為防火墻二次認證:原理、實踐與安全價值解析

引言&#xff1a;數字化轉型中的身份認證挑戰 在數字化轉型加速的今天&#xff0c;企業網絡邊界日益模糊&#xff0c;混合云架構、遠程辦公、物聯網設備接入等場景對網絡安全提出全新挑戰。傳統防火墻基于IP/端口的訪問控制已無法滿足動態安全需求&#xff0c;如何構建"持…

golang--context的使用指南與核心特性

Go 語言 context 包&#xff1a;使用指南與核心特性 一、context 的本質與設計目的 context 是 Go 語言中管理請求生命周期的核心機制&#xff0c;它提供了一套統一的方式來&#xff1a; 傳遞請求范圍數據&#xff08;如用戶認證信息&#xff09;控制跨 goroutine 的生命周期…

耗時3小時,把這兩天做好的爬蟲程序,用Python封裝成exe文件

先執行命令如下&#xff1a; pip install pyinstaller py -m PyInstaller --log-levelDEBUG --add-data "config.ini;." nmpa_gui.py很快在dist目錄下就有生成一個nmpa_gui文件夾&#xff0c;運行 nmpa_gui.exe&#xff0c;報錯&#xff1a; 1??初始化爬蟲… 程序…

Linux下nginx訪問路徑頁面

第一步&#xff1a;通過Xshell在虛擬機中下載nginx sudo apt-get install nginx 第二步&#xff1a;進入nginx配置頁面 cd /etc/nginx 我這里創建了一個html文件夾 在進入去創建頁面并且重新加載 boahuboahu-VMware-Virtual-Platform:/$ cd /etc/nginx boahuboahu-VMware-Vir…

三維視頻融合怎么弄?三步實現精準投射與自由修剪

分享大綱&#xff1a; 1、場景引入&#xff1a;為什么你的三維場景視頻融合效果不理想&#xff1f; 2、解決方案&#xff1a;捷碼視頻融合三步操作指南 3、捷碼平臺&#xff1a;低代碼構建動態三維視界 在智慧城市中的安防領域&#xff0c;將實時視頻與三維場景融合已是大勢需求…