① python对文件的独操作有哪几种请详细说明每种方法
1.打开文件:
f=open(r'E:\PythonProjects\test7\a.txt',mode='rt',encoding='utf-8')
以上三个单引号内分别表示:要打开的文件的路径,mode为文件打开方式具体介绍在下文,encoding为文件的字符编码,一般默认为utf-8
2.读写文件:
data=f.read() # 读文件
f.write() # 写文件
3.关闭文件:
f.close()
4.为了简便,一般采用上下文的方法进行文件操作,可不用关闭文件
with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
print(data)
with open('a.txt',mode='wt',encoding='utf-8') as f:
f.write('hello world')
5.控制文件读写的操作:
r:(默认模式):只读:以该模式打开文件时,若文件不存在则报错,若文件存在,则文件指针在文件开头,即从文件开头开始读文件
w:只写:以该模式打开文件时,若文件不存在则创建一个文件,如文件存在,则清空文件内容,文件指针移到开头
a:追加写:以该模式打开文件时,若文件不存在则创建一个文件,如文件存在,则将文件指针移到文件末尾,在文件末尾写入新的内容
6.控制文件读写内容的模式:(t 和 b都不能单独使用,必须与r,w,a结合使用)
t:(默认):无论读写都是以字符为单位,只能识别文本文件,必须要制定encoding
b:无论读写都是以字节为单位,可以识别所有文件,一定不能指定encoding
7.文件的拷贝
with open ('a.txt',mode='rb') as af,\
open('b.txt',mode='wb') as bf:
data=af.read
f.write(data)
执行程序后,打开文件,即可发现文件已成功拷贝,这里使用 b 而不是用 t 模式,是因为文件有多种格式
8.文件的修改:
文件的修改是在硬盘上实现文件的覆盖,相当于一个新的文件以旧的文件名来命名的; 文件的修改有俩种方式,分别适用于不同的情景
方式一(适用于容量小的文件):这种方式的原理是:创建一个新的文件,将旧文件的内容拷贝到新的文件中;这样内存里就存在俩个文件,故不适用于容量大的文件,具体代码见下方 View
with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
data_new=data.replace('yang', 'yv')
with open('b.txt',mode='wt',encoding='utf-8')as p:
p.write(data_new)
方式二(适用于容量大的文件):此方式的原理为:读取旧文件的一行内容,修改后写到临时文件中,循环往复直到写完,然后将源文件删除,将临时文件命名为源文件名.这种方式在内存中只存在2行文件,节省内存,可用于大文件
import os
with open('b.txt',mode='rt',encoding='utf-8') as f,\
open('.b.txt.swap',mode='wt',encoding='utf-8') as p:
for line in f:
p.write(line.replace('yv','yang'))
# 调用replace方法,将源文件中的'yv',换成'yang'
os.remove('b.txt')
os.rename('.b.txt.swap','b.txt')
9. 文件的阶段:truncate(n)
将文件中n个字节后内容全删了,当 n 不存在时,即删除文件全部内容
10.文件内指针的移动
f.seek(): 指针的移动是以字节为单位的
seek 有三种模式:
0:(默认模式) 指针在文件开头,只有在 0 模式可以在 t 模式下用,也可以在 b 模式下用,而 1 ,2 模式只能在 b 模式下使用
1:指针在当前位置
2:指针在文件末尾
以下为具体事例:
# 0
with open('a.txt',mode='rt',encoding='utf-8')as f:
f.seek(3,0)
print(f.tell()) # 指针当前位置
print(f.read()) # 从指针后读出所有内容
# 1 参照指针当前位置
with open('a.txt',mode='rb')as f:
f.read(2)
f.seek(4,1)
print(f.tell())
print(f.read().decode('utf-8'))
# 2 参照文件末尾
with open('a.txt',mode='rb')as f:
f.seek(-5,2)
print(f.tell())
print(f.read().decode('utf-8'))
当 seek处于 2 模式时,可以将文件中新加入的内容打印出来,具体代码如下:
# 另一个文件进行写操作,写的代码如下:
with open('a.txt',mode='at',encoding='utf-8')as f:
f.write('hello world\n')
# 每在文件中写入新的内容,都打印出来,以下代码执行打印操作:
import time
with open('a.txt',mode='rb')as f:
f.seek(0,2)
while True:
line=f.readline() # readline 可以读取没有内容的部分
# print(line.decode('utf-8'))
if len(line)==0:
time.sleep(0.1)
else:
print(line.decode('utf-8'))
② python中浅拷贝和深拷贝的区别
python一般有三种拷贝方法。
以alist=[1,2,3,["a","b"]]为例:
(1)直接赋值。传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
>>> b=alist
>>> print b
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print b
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]
(2)浅拷贝。没有拷贝子对象,所以原始数据改变,子对象会改变。
>>> import
>>> c=.(alist)
>>> print alist;print c
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print c
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]
>>> alist[3]
['a', 'b']
>>> alist[3].append('cccc')
>>> print alist;print c
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']] 里面的子对象被改变了
(3)深拷贝。包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变。
>>> import
>>> d=.deep(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccccc")
>>> print alist;print d
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']] 始终没有改变
③ python深拷贝和浅拷贝的区别
(1)浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变
>>> import
>>> c=.(alist)
>>> print alist;print c
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print c
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]
>>> alist[3]
['a', 'b']
>>> alist[3].append('cccc')
>>> print alist;print c
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']] 里面的子对象被改变了
(2)深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变
>>> import
>>> d=.deep(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccccc")
>>> print alist;print d
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']] 始终没有改变
④ python 中如何实现对文件的复制、粘贴
file类中没有提供专门的文件复制函数,因此只能通过使用文件的读写函数来实现文件的复制。这里仅仅给出范例:
src = file("myfile.txt", "w+")
temp = ["hello world! \n"]
src.writelines(temp)
src.close()
src = file("myfile.txt", "r+")
des = file("myfile2.txt", "w+")
des.writelines(src.read())
src.close()
des.close()
shutil模块是另一个文件,目录的管理接口,提供了一些用于复制文件,目录的函数。file()函数可以实现文件的拷贝,声明如下:
file(src, des)
文件的剪切可以使用move()函数模拟,声明如下:
move(src,des)
功能:移动一个文件或者目录到指定的位置,并且可以根据参数des重命名移动后的文件。
⑤ 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就可以打开这个压缩文件,然后我找到报错的那个文件,然后用这个报错的文件和正常的文件里面这个去做了对比,发现莫名其妙的多了一些东西,删除掉以后再打开就正常了. 这也是我没有解决的问题,希望有大佬能够指点一二 具体的报错 截图 就是文章中附带的截图