文件的操作
以下所有代码可合为一个程序,具体输出,读者可自行编译加深理解
模式可参考https://www.runoob.com/python3/python3-file-methods.html
打开文件使用open函数,可以打开一个已经存在的文件,如果没有这个文件的话,会创建一个新文件
语法格式: open(‘文件名称’,‘打开模式’,encoding=‘编码类型’)
'''
文件打开模式
r 以只读方式打开文件,文件的指针将会放在文件的开头,这是默认模式。
w 打开一个文件只用于写入。如果该文件已经存在则将其覆盖,如果不存在,创建新文件。
r+ 打开一个文件用于读写,文件指针将会被放在文件的开头。
w+ 打开一个文件用于读写。如果该文件已经存在则将其覆盖,如果不存在,创建新文件。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已经存在则将其覆盖,如果不存在,创建新文件。
a 打开一个文件用于追加,如果文件已经存在,文件指针将会放在文件的结尾,也就是说,新的内容将会被写到已有内容之后。
如果文件不存在,创建新的文件进行写入。
'''
默认是GBK,为中文编码,最好在打开文件时指定编码类型
File1_Object = open(‘Text1.txt’, ‘w’, encoding=‘utf-8’) # 返会一个文件对象赋值给File1_Object
开始写操作
File1_Object.write('始知相忆深\n') # 往该对象里写入内容
File1_Object.write('直道相思了无益,未妨惆怅是清狂\n')
File1_Object.close() # 保存并关闭
以二进制的形式去写数据
File2_Object = open('Text2.txt', 'wb') # str->bytes
File2_Object.write('我喜欢的人要心若明镜,眼若星辰,便是看尽人间丑恶,也依然心怀善良,优雅从容!\n'.encode('utf-8'))
File2_Object.close()
追加
File3_Object = open('Text1.txt', 'a', encoding='utf-8')
File3_Object.write('我喜欢的人要心若明镜,眼若星辰,便是看尽人间丑恶,也依然心怀善良,优雅从容!\n')
File3_Object.close()
# 后面不加encoding='utf-8',默认为gbk
File5_Object = open('Text3.txt', 'w')
File5_Object.write('将头发梳成大人摸样\n')
File5_Object.write('换上一身帅气西装\n')
File5_Object.write('等回来见你一定比想象美\n')
File5_Object.close()
读文件
read(),将文件的内容全部读取出来。
File4_Object = open('Text1.txt', 'r', encoding='utf-8')
print(File4_Object.read())
File4_Object.close()
read(num),传入一个参数,表示读取指定字符个数
File4_Object = open('Text1.txt', 'r', encoding='utf-8')
print(File4_Object.read(4)) # 只读取前四个字符
print(File4_Object.read()) # 第二次读取将从上一次读取的位置继续读取
File4_Object.close()
print()
readline() 一次性读一行
File4_Object = open('Text3.txt', 'r')
print(File4_Object.readline())
print(File4_Object.readline()) # 第二次读取将从第二行开始
print(File4_Object.readline())
File4_Object.close()
# readlines() 按行读取,一次性读取所有内容,返回一个列表,每一行内容作为一个元素
```python
File5_Object = open('Text3.txt', mode='r')
print(File5_Object.readlines())
File5_Object.close()
以二进制形式读文件
File5_Object = open('Text2.txt', 'rb')
content = File5_Object.read()
print(content.decode('utf-8'))
File5_Object.close()
File5_Object = open('Text3.txt', 'rb')
content = File5_Object.readline()
print(content.decode('gbk'))
File5_Object.close()
with上下文管理对象
可以自动释放打开的对象
with open('Text2.txt', 'r', encoding='utf-8')as File5_Object:
print(File5_Object.read())
文件拷贝
def Copy_File():
# 接收用户输入的文件名
Original_File = input('请输入要备份的文件名:')
New_File_Name = Original_File.split('.') #分割接收到的文件名
New_File = New_File_Name[0] + '_copy.' + New_File_Name[1]
Original_File_Object = open(Original_File, mode='r', encoding='utf-8') # 以只读的模式打开之前的文件
New_File_Object = open(New_File, mode='w', encoding='utf-8') # 以写入的方式打开新备份的文件
New_File_Object.write(Original_File_Object.read())
Original_File_Object.close()
New_File_Object.close()
pass
Copy_File()
New_File = open('Text_copy.txt', mode='r', encoding='utf-8')
print(New_File.readlines())
New_File.close()
拷贝大文件
def Copy_Big_File():
# 接收用户输入的文件名
Original_File = input('请输入要备份的文件名:')
New_File_Name = Original_File.split('.') #分割接收到的文件名
New_File = New_File_Name[0] + '_copy.' + New_File_Name[1]
try:
with open(Original_File, mode='r', encoding='utf-8')as Original_File_Object, open(New_File, mode='r', encoding='utf-8')as New_File_Object:
while True:
connect = Original_File_Object.read(1024)
New_File_Object.read(connect)
if len(connect) < 1024:
break
pass
pass
pass
pass
except Exception as msg:
print(msg)
pass
pass
Copy_Big_File()
tell()
文件定位,指的是当前文件指针读取到的位置,光标位置。在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取
File_Object = open('Text.txt', mode='r', encoding='utf-8')
print(File_Object.read(2))
print(File_Object.tell())
print(File_Object.read(5))
print(File_Object.tell())
File_Object.close()
# utf-8编码格式中每个汉字占3个字节
print()
truncate(size) 可以对源文件进行截取操作,截取size字节大小数据,截取之后源文件将被修改,里面只剩下截取的数据
File_Object = open('Text.txt', mode='r', encoding='utf-8')
print('截取之前文件里的内容:')
print(File_Object.read())
File_Object.close()
File_Object = open('Text.txt', mode='r+', encoding='utf-8')
print()
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
File_Object.truncate(18) # 执行完此行代码后源文件会被修改
print(File_Object.tell())
print('截取之前文件里的内容:')
print(File_Object.read())
print(File_Object.tell())
File_Object.close()
print()
seek()
在操作文件的过程,可定位到其他位置进行操作
seek(offset,from)有2个参数,offset指偏移字节量,负数是往前偏移,正数是往后偏移。from位置,0表示文件开头,1表示当前位置,2表示文件末尾
File_Object = open('Text1.txt', mode='rb')
print(File_Object.read(15).decode('utf-8'))
print(File_Object.tell()) File_Object.seek(-6, 1)
print(File_Object.tell())
print(File_Object.read(6).decode('utf-8')) File_Object.close()
''' 使用seek()函数时,有时候会报错为 “io.UnsupportedOperation: can't do
nonzero cur-relative seeks”
照理说,按照seek()方法的格式file.seek(offset,whence),后面的1代表从当前位置开始算起进行偏移,那又为什么报错呢?
这是因为,在文本文件中,没有使用b模式选项打开的文件,只允许从文件头开始计算相对位置,从文件尾计算时就会引发异常。 将
f=open("aaa.txt","r+") 改成 f = open("aaa.txt","rb") 就可以了 '''
转载:https://blog.csdn.net/Falcont/article/details/115578897
查看评论