① python的深拷貝和淺拷貝
1.什麼是深拷貝?什麼是淺拷貝?(深拷貝與淺拷貝的區別)
簡單點來說,就是假設B復制了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,
如果B沒變,那就是深拷貝,自食其力。
也可以這么說: 淺拷貝沒有拷貝子對象,所以原始數據改變,子對象會改變;深拷貝,包含對象裡面的子對象的拷貝,所以原始對象的改變不會造成深拷貝里任何子元素的改變
(1)父對象是可變對象拷貝,只拷貝父對象的的值,不會對其子對象的值進行拷貝而是拷貝的子對象的索引,然後創建一個新的對象(ID地址不一樣),如果子對象是可變對象,依然是可以修改的。
(2)父對象是不可變對象的拷貝,就悶首襲是對另外一個變數的內存地址的拷貝(ID地址一樣)或者螞兄說對象引用。
import
a1=[1,2]
a2=[3,4]
a=[a1,a2]
b=.(a)#淺拷貝
c=.deep(a)#深拷貝
print(id(a)) #140414167869960
print(id(b)) #140414167869896
print(id(c)) #140414167869832
print(id(a[0])) # 140414167868488
print(id(b[0])) #140414167868488
print(id(c[0])) #140414167869768
"""
"""
import
a1=(1,2)
a2=(3,4)
a=(a1,a2)
b=.(a)
c=.deep(a)
print(id(a)) #140648248055496
print(id(b)) #140648248055496
print(id(c)) #140648248055496
print(id(a[0])) #140648248055944
print(id(b[0])) #140648248055944
print(id(c[0])) #140648248055944
""芹段"
② Python對象的拷貝
Python賦值操作或函數參數傳遞,傳遞的永遠是對象引用(即內存地址),而不是對象內容。在Python中一切皆對象,對象又分為可變(mutable)和不可變(immutable)兩種類型。對象拷貝是指在內存中創建新的對象,產生新的內存地址。當頂層對象和它的子元素對象全都是immutable不可變對象時,不存在被拷貝,因為沒有產生新對象。淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象。
Python中一切皆對象,對象就像一個塑料盒子, 裡面裝的是數據。對象有不同類型,例如布爾型和整型,類型決定了可以對它進行的操作。現實生活中的"陶器"會暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。
對象的類型還決定了它裝著的數據是允許被修改的變數(可變的mutable)還是不可被修改的常量(不可變的immutable)。你可以把不可變對象想像成一個透明但封閉的盒子:你可以看到裡面裝的數據,但是無法改變它。類似地,可變對象就像一個開著口的盒子,你不僅可以看到里困困面的數據,還可以拿出來修改它,但你無法改變這個盒子本身,即你無法改變對象的類型。
對象拷貝是指在內存中創建新的對象,產生新的內存地址。
淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。
2.1.1. 頂層是mutable,子元素全是immutable
當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, 'world', 2]
① 創建列表對象並賦值給變數a
② 導入模塊,使用.()函數淺拷貝a,並賦值給變數b
③ 修改變數a的子元素a[0] = 3,由於整數是耐汪不可變對象,所以並不是修改1變為3,而是更改a[0]指向對象3
當頂層對象是 mutable可變對象 ,但子元素也存在 mutable可變對象 時,如 [1, 2, ['hello','world']]
① 淺拷貝 .() 只拷貝了頂層對象,沒有拷貝子元素對象['hello','world'],即a[2]和b[2]指向同一個列表對象
② 修改a[2][1] = 'china',則b[2][1] = 'china'
當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)
變數a與變數b指向的是同一個元組對象,沒有拷貝
當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, ['hello','world'])
變數a與變數b指向的是相同的元組對象,並且a[2]與b[2]指向同一個列表,所以修改a[2][1]會影響b[2][1]
深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象
當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, 'world', 2]
變數a與變數b指向不同的列表對象,修改a[0]只是將列表a的第一個元素重新指向新對象,不會影響b[0]
當頂層對象是mutable可變對象,但昌尺仔子元素也存在mutable可變對象時,如[1, 2, ['hello','world']]
深拷貝既拷貝了頂層對象,又遞歸拷貝了子元素對象,所以a[2]與b[2]指向了兩個不同的列表對象(但是列表對象的子元素初始指定的字元串對象一樣),修改a[2][1] = 'china'後,它重新指向了新的字元串對象(內存地址為140531581905808),不會影響到b[2][1]
當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)
變數a與變數b指向的是同一個元組對象,不存在拷貝
當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, ['hello','world'])
變數a與變數b指向的是不同的元組對象,同時a[2]與b[2]指向不同的列表對象,所以修改a[2][1]不會影響b[2][1]
使用=是賦值,即將列表對象的引用也賦值給變數b,可以將列表對象想像成一個盒子,變數a相當於這個盒子上的標簽,執行b = a後,相當於再在這個盒子上貼上b標簽,a和b實際上指向的是同一個對象。因此,無論我們是通過a還是通過b來修改列表的內容,其結果都會作用於雙方。
b/c/d都是a的復制,它們都指向了不同的列表對象,但是沒有拷貝子元素,a[2]和b[2]/c[2]/d[2]指向同一個列表, 相當於淺拷貝的效果
使用分片[:]操作,a和b其實是指向同一個元組,而且沒有拷貝子元素,a[2]和b[2]也指向同一個列表,相當於淺拷貝的效果
同列表類似,可以使用字典的()函數或者轉換函數dict()
變數a與變數b/c指向不同的字典,但是沒有拷貝子元素,a['jobs']和b['jobs']/c['jobs']指定同一個列表, 相當於淺拷貝的效果
同列表類似,可以使用集合的()函數或者轉換函數set()
變數a與變數b/c指向不同的集合,而集合的元素必須是hashable,所以修改集合a不會影響到b/c
③ python 復制文件
報錯多半是這句targetDir = targetDir+'/'+os.path.split(sourceDir)[1]
你這句把本來的targetDir覆蓋了,導致後面的文件的目標文件夾被修改
發個我寫的吧,參考下吧
defFile(sourceDir,targetDir):
ifnotos.path.exists(targetDir):
os.makedirs(targetDir)
forfilenameinos.listdir(sourceDir):
path=os.path.join(sourceDir,filename)
ifos.path.isdir(path):
targetSubDir=os.path.join(targetDir,filename)
File(path,targetSubDir)
else:
targetPath=os.path.join(targetDir,filename)
open(targetPath,'wb').write(open(path,'rb').read())
④ Python帶格式拷貝excel表格(從A拷貝到B)
使用openpyxl包 從表A.xlsx 完全拷貝數據到表B.xlsx openpyxl這個包不支持xls格式的excel文件
如果A.xlsx中的數據有用到公式自動求和的,在讀取A.xlsx中的的數據的時候 需要
load_workbook(A.xlsx,data_only=True)這樣加第二個參數 只讀取數據否則讀出來的就是公式.
下面是重點如果A.xlsx中的表格帶有填充顏色 合並單元格字體格式 等等需要如下這樣做
myfile = A.xlsx
targFile = B.xlsx
wb = load_workbook(myfile,data_only=True)._sheets #原要拷貝單元格
wb2 = load_workbook(targFile) # 目標單元格
wr = wb[index]
ws = wb2._sheets[1]
# 兩個for循環遍歷整個excel的單元格內容
for i, row in enumerate(wr.iter_rows()):
for j, cell in enumerate(row):
ws.cell(row=i + 1, column=j + 1, value= cell.value) #拷貝數值
ws.cell(row=i + 1, column=j + 1).number_format=cell.number_format #拷數字格式
ws.cell(row=i + 1, column=j + 1).alignment = .(cell.alignment) #
ws.cell(row=i + 1, column=j + 1).font = .(cell.font) #拷貝字體
ws.cell(row=i + 1, column=j + 1).border = .(cell.border) #拷貝值
ws.cell(row=i + 1, column=j + 1).fill = .(cell.fill) #拷貝填充顏色答慎行
for merg in wr.merged_cells:
ws.merge_cells(str(merg)) #合並單元格
wb2.save(targFile)
這樣數據就能完美的從從A拷貝到B啦.格式樣式完全一樣.
但是 也有兩個我沒有攻克的問題 在這孝賣里說一下吧 希望有大佬能解決並告知在下 ,不勝感激
問題一 從表A中拷貝數據到表B以後 如果表B裡面也設置了對數據的公式計算,這個時候 如果不打開表B,直接再把表B裡面求和的數據 拷貝到表C的話 數值是拷貝不過去的.打開表C會發現沒有數值,我查了一些資料 好像是說 表B裡面的數 如果是像上面這樣拷貝過去然後通過公式直接計算的值 沒有保存上. 所以 要想把數值拷貝到C或者讀出來的話 ,需要手動打開表B然後,關閉的時候保存一下才可以.這是問題一. 因為清嘩我遇到了一個這樣的需求,需要連續拷貝從A拷到B,再把B裡面求和的數據拷到C.希望有大佬能夠指點一下
問題二就比較神奇了
我把表A裡面的數據拆分拷貝到了另外五個匯總的表格裡面,這五個其中有一個打開以後會報錯,顯示 excel文件格式錯誤.這五個表格在拷貝數據以前就已經存在了,那個時候打開都是沒有問題的,只有在拷貝完數據以後會報錯,我也不清楚具體的原因. 查了一些資料以後知道,excel表格其實是一種特殊的壓縮包,只要把後綴改成zip就可以打開這個壓縮文件,然後我找到報錯的那個文件,然後用這個報錯的文件和正常的文件裡面這個去做了對比,發現莫名其妙的多了一些東西,刪除掉以後再打開就正常了. 這也是我沒有解決的問題,希望有大佬能夠指點一二 具體的報錯 截圖 就是文章中附帶的截圖
⑤ python 中如何實現對文件的復制、粘貼
用shutil模塊
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import os
import os.path
from shutil import
dest_dir = ur'd:\新建文件專夾屬'
if not os.path.isdir(dest_dir):
os.makedirs(dest_dir)
file_path = ur'c:\123\1.txt'
(file_path, dest_dir)
⑥ Python復制文件命令合集
python的shutil模塊提供了便捷的復制文件命令
shutil.(srcfile,dstfile) #拷貝文件,目標文件必須存在,否則就會報錯
shutil.file(srcfile,dstfile) #拷貝文件,目標 文件無需巧蘆凳存在
shutil.tree(srcdir,dstdir) #srcdir為源目錄,dstdir為目標目錄,復制時,如果dstdir已經存在時,會報FileExistsError錯誤,提示「當文件已存在時,無法創建該文件」
shutil.mode(src, dst) # 僅拷貝許可權。內孝旅容、組、用戶均不變,目標文件嘩昌必須存在
⑦ 如何用python復制文件和文件夾
這個方法不能把物備文件夾復制到文件夾裡面去。
10.shutil.tree('E:\test\good', 'E:\test\vivi')
tree不能把文件夾復制喚螞到已存在的文件夾裡面去。
11.shutil.tree('E:\test\good', 'E:\test\new folder')
只罩鏈毀能復制到新創建的文件夾裡面。
有相同名字的文件,就會出錯,注意修改文件名。
⑧ python復制excel文件
# -*- coding: utf-8 -*-
import xlrd
import shutil
import os
def read_excel():
# 打開文件
workbook = xlrd.open_workbook(r'C:\Users\xxx\Desktop\xxx.xls')
# 獲取所有sheet
print (workbook.sheet_names()) # [u'sheet1', u'sheet2']
#獲取sheet
sheet= workbook.sheet_names()[0]
sheet_data=workbook.sheet_by_name(sheet)
print(sheet_data)
# sheet的名稱,行數,列數
print (sheet_data.name,sheet_data.nrows,sheet_data.ncols)
rows = sheet_data.row_values(0) # 獲取第四行內容
cols = sheet_data.col_values(2) # 獲取第三列內容
print (rows)
for i,j in enumerate(rows):
print(i,':',j)
for i in range(sheet_data.nrows):
strr=sheet_data.row_values(i)[5][:5]
if(strr == 'AXIAL'):
dicom_path=sheet_data.row_values(i)[15]
row_path=sheet_data.row_values(i)[16]
print(row_path)
roww=row_path.split('\\',3)[3]
print(roww)
#row_path='C:\Users\xxx\Desktop\xxx'
path_now=os.path.join('\\\\xxx',roww)
print(path_now)
shutil.tree(path_now,r'C:\Users\xxx\Desktop\Get')
#shutil.tree(row_path,r'C:\Users\xxx\Desktop')
break
if __name__ == '__main__':
read_excel()
#文件復制主要利用shutil包,tree的第一個參數為需要復制的文件夾,第二個參數為目標位置;但第二個參數的目標位置必須不存在,否則會報錯。
⑨ python直接安裝後的文件夾能使用嗎
python直接安裝後的文件夾不能使用。如果是直接拷貝.py腳本文件到其他沒裝python的電腦上是不能運行的,如果想把編寫的腳本在其他電腦上洞伏虧直接雙擊運行,可納神以去下載pyinstaller庫,windows可直接pipinstallpyinstaller安裝,然後在打開命令行,cd到腳本文件的目錄或者在腳本文件的目錄打開cmd,然後輸入pyinstallerF加上腳本文件名(記得加上文件後綴)廳拍。
⑩ Python的shutil模塊中文件的復制操作
shutil.file(src, dst):將名為src的文件的內容復制到名為dst的文件中 。
src, dst是文件名
shutil.(source, destination)
shutil.() 函數實現文件復制功能,將 source 文件復制游睜到 destination 文件夾中,兩個參數滾磨指都是字元串格式。如果 destination 是一大配個文件名稱,那麼它會被用來當作復制後的文件名稱,即等於 復制 + 重命名。
source一定是文件名,destination可以是文件名也可以是文件夾名
舉例如下:
shutil 模塊