① 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 模块