1. 程式人生 > >文件的操作,深淺拷貝

文件的操作,深淺拷貝

句柄 重命名 writable name adl 下使用 eno 指向 網絡編程

f = open("D:\美女護士教師主婦聯系方式.txt",encoding=‘utf-8‘,mode=‘r‘)
print(f.read())
f.close()
"""
f 變量: f,f1,file,file_handler,fh,f_h..... 文件句柄.
open() python的內置函數,python提供的一個功能,
底層調用的是操作系統的調用文件命令,接口.
windows: 編碼:gbk.
linux,ms: 編碼是utf-8.

操作文件的流程:
1,打開文件,產生一個文件句柄.
2, 對文件句柄進行相應的操作.
3,關閉文件句柄.

"""

r r+ rb r+b

r
read() 全部讀取
f1 = open(‘r模式‘,encoding=‘utf-8‘)
content = f1.read()
print(content,type(content))
#f1.close()

read(n)
‘‘‘
r模式: n 字符
rb模式: n 字節
‘‘‘
f1 = open(‘r模式‘,encoding=‘utf-8‘)
print(f1.read(3))
f1.close()

f1 = open(‘r模式‘,mode=‘rb‘)
print(f1.read(3))
f1.close()


readline() 按行讀取
f1 = open(‘r模式‘,encoding=‘utf-8‘)

print(f1.readline().strip())
print(f1.readline().strip())

f1.close()

readlines()
返回一個list 列表的每個元素是源文件的每一行.
f1 = open(‘r模式‘,encoding=‘utf-8‘)
print(f1.readlines())
f1.close()

循環讀取

f1 = open(‘r模式‘,encoding=‘utf-8‘)
for line in f1:
print(line)
f1.close()

rb 以字節的形式讀取
帶b的一般操作的都是非文字類的文件.

f1 = open(‘美女.jpg‘,mode=‘rb‘)

print(f1.read())
f1.close()

f1 = open(‘r模式‘,mode=‘rb‘)
print(f1.read())
f1.close()


r+ 讀寫模式:先讀後寫

f1 = open(‘r模式‘,encoding=‘utf-8‘)
content = f1.read()
print(content,type(content))
f1.close()

f1 = open(‘r模式‘,encoding=‘utf-8‘,mode=‘r+‘)
content = f1.read()
print(content)
f1.write(‘666‘)
f1.close()

f1 = open(‘r模式‘,encoding=‘utf-8‘,mode=‘r+‘)
f1.write(‘666‘)
print(f1.read())
f1.close()

w w+ wb w+b
w
沒有文件,創建文件,寫入內容
f = open(‘w模式‘,encoding=‘utf-8‘,mode=‘w‘)
f.write(‘隨便寫一點‘)
f.close()
如果有文件,先清空內容,後寫入
f = open(‘w模式‘,encoding=‘utf-8‘,mode=‘w‘)
f.write(‘1alex is a lower man\n‘)
f.write(‘1alex is a lower man\n‘)
f.write(‘1alex is a lower man\n‘)
f.write(‘1alex is a lower man\n‘) for i in range(4):
f.write(‘Alex is a lower man\n‘)
f.close()

wb
f1 = open(‘美女.jpg‘,mode=‘rb‘)
content = f1.read()
f1.close()

f2 = open(‘美女1.jpg‘,mode=‘wb‘)
f2.write(content)
f2.close()

f1 = open(‘r模式‘,encoding=‘utf-8‘)
print(f1.read())
print(f1.fileno()) # 用不到
1.close()

f1 = open(‘其他操作方法‘,encoding=‘utf-8‘,mode=‘w‘)
f1.write(‘jfkdlsfjdsafkds‘)
f1.flush() # 強制保存
f1.close()


readable writeable

f1 = open(‘其他操作方法‘,encoding=‘utf-8‘)
print(f1.readable()) # True
f1.write(‘fdsafs‘)
print(f1.writable()) # False
if f1.writable():
f1.write(‘fhdsklafjds‘)
f1.close()

seek tell
網絡編程: FTP的作業,斷點續傳的功能. seek tell
f1 = open(‘其他操作方法‘,encoding=‘utf-8‘)
f1.seek(9) # 按照字節調整光標位置
print(f1.tell()) # 獲取光標的位置
print(f1.read())
print(f1.tell())
f1.close()
truncate # 對原文件進行截取
他必須在可寫情況下使用.

f = open(‘其他操作方法‘,encoding=‘utf-8‘,mode=‘r+‘)
f.seek(3) # 調整光標對truncate不管用
f.truncate(9) # truncate都是從文件的開始進行截取,以字節為單位.
f.close()

總結:
最常用的幾個方法 read seek tell flush readable writeable

打開文件的第二種方式:

優點:
1,省去了寫f.close()
with open(‘其他操作方法‘,encoding=‘utf-8‘) as f1:
print(f1.read())

2,一個with語句可以操作多個文件句柄.

with open(‘其他操作方法‘,encoding=‘utf-8‘) as f1,\
open(‘r模式‘,encoding=‘utf-8‘,mode=‘w‘) as f2:
print(f1.read())
f2.write(‘5435435‘)
f2.write(‘dhfjkdshjfdskhf‘)

缺點:

IOError
with open(‘其他操作方法‘, encoding=‘utf-8‘) as f1:
print(f1.read())
# ******各種邏輯******
f1.close()
with open(‘其他操作方法‘, encoding=‘utf-8‘, mode=‘w‘) as f2:
pass

1,以讀的模式打開原文件.
2,以寫的模式創建一個新文件.
import os
with open(‘alex自述‘,encoding=‘utf-8‘) as f1,\
open(‘alex自述.bak‘,encoding=‘utf-8‘,mode=‘w‘) as f2:
3,將原文件內容讀取出來,按照你的要求改成新內容,寫入新文件.
old_content = f1.read()
new_content = old_content.replace(‘alex‘,‘sb‘)
f2.write(new_content)
4,刪除原文件.
os.remove(‘alex自述‘)
5,將新文件重命名成原文件.
os.rename(‘alex自述.bak‘,‘alex自述‘)

高大上版

1,以讀的模式打開原文件.
2,以寫的模式創建一個新文件.
import os
with open(‘alex自述‘,encoding=‘utf-8‘) as f1,\
open(‘alex自述.bak‘,encoding=‘utf-8‘,mode=‘w‘) as f2:
3,將原文件內容讀取出來,按照你的要求改成新內容,寫入新文件.
for old_line in f1:
new_line = old_line.replace(‘alex‘,‘sb‘)
f2.write(new_line)

4,刪除原文件.
os.remove(‘alex自述‘)
5,將新文件重命名成原文件.
os.rename(‘alex自述.bak‘,‘alex自述‘)

ret = ‘alex dfjaslkdf‘
print(ret.replace(‘太白‘,‘男神‘))

賦值運算 變量指向的是同一個.
l1 = [1, 2, 3, [11, 22]]
l2 = l1
l2.append(666)
l2[-1].append(666)
print(l1)
print(l2)
print(l1)
print(l2)


淺copy 列表舉例
dict set
copy 復制, 淺淺的復制一份.
l1 = [1, 2, 3, [11, 22]]
l2 = l1.copy()

print(l2) # [1, 2, 3, [11, 22]]
print(id(l1))
print(id(l2))
print(id(l1[0]))
print(id(l2[0]))
print(id(l1[-1]))
print(id(l2[-1]))
給l1添加一個元素,l2 不變
l1.append(666)
l1[-1].append(666)
print(l1)
print(l2)

l1 = [1, 2, 3, [11, 22]]
l2 = l1.copy()
l1[0] = 5
print(l1)
print(l2)
淺copy: 無論是同一個代碼塊,不同代碼塊下:
復制一個外殼(列表),但是列表裏面的所有元素,都共用一個.


深copy : 深深的復制一下.
import copy
l1 = [1, 2, 3, [11, 22]]
l2 = copy.deepcopy(l1)
print(l1)
print(l2)
print(id(l1),id(l2))
print(id(l1[0])) # 1868196880
print(id(l2[0])) # 1868196880

可變的數據類型 重新創建一份
print(id(l1[-1])) # 2158525445320
print(id(l2[-1])) # 2158525446792

l1[-1].append(666)
print(l1)
print(l2)


深copy: 論是同一個代碼塊,不同代碼塊下:
不僅創建一個新外殼(列表),外殼裏面的可變的數據類型也創建一份新的,但是不可變的數據類型共用一個.


面試題
l1 = [1, 2, [11,]]
l2 = l1[:] # 全切: 淺copy
l1[-1].append(666)
print(l2)


l1 = [1, 2, [11,]]
l2 = l1.copy()
l1[-1].append(666)
print(l2)

文件的操作,深淺拷貝