Python基础学习之文件操作
1. open() 函数
想要对文件进行操作,必须先建立文件对象,然后再对文件对象进行操作; 想要建立文件对象,需要使用open() 函数;open()函数使用方法如下:
file_object = open(file_name [, access_mode][, buffering])
函数中各个参数的解释如下:
- file_name:文件名称,如果文件在py程序所在文件夹,则可以直接读取。如果在其他文件夹,则可以传入对应路径;
- access_mode:access_mode是打开文件的模式:只读,写入,追加等,默认文件访问模式为只读 (r)。其余方式见表一:文件模式表;
- buffering: 如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
表一:文件模式表
模式 | 解释 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(不推荐)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
表二:模式总结
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
2. 文件对象的属性
2.1 closed;mode;name;softspace;
- file_object.closed : 返回true如果文件已被关闭,否则返回false。
- file_object.mode : 返回被打开文件的访问模式。
- file_object.name : 返回文件的名称。
- file_object.softspace :如果用print输出后,必须跟一个空格符,则返回false。否则返回true。
2.2 文件属性举例:
# 打开一个文件
f = open("text.txt", "w")
print("文件名: ", f.name) # 输出:text.txt
print("是否已关闭 : ", f.closed) # 输出:False
print("访问模式 : ", f.mode) # 输出:w
print("末尾是否强制加空格 : ", f.softspace) # 输出:0
3. 文件对象的方法
3.1 read()
read()函数可以读取一个文件对象中的字符,使用方法如下:
file_object.read(count)
- count:此参数为读取的字节数;若传入,则从头开始读取 count 数量的字符;若不传入,默认为尽可能多的读取,所以文件一般会被完全读取;
# test.txt 文件内容:
hello world!
hello everyone!
- 部分读取:
f = open("test.txt",'r+') # 创建文件对象f
str1=f.read(10) # 读取前10个字符
print(str1) # 打印读取值,输出:hello worl
str2=f.read()
print(str2) # 打印所有值,输出:d hello everyone!
# 由于游标在读取10个字符后,已经移动到第十个字符,所以str2是从d开始读取的;
f.close() # 关闭文件对象
- 全部读取
f = open("test.txt",'r+') # 创建文件对象f
str2=f.read() # 读取所有字符
print(str2) # 打印所有字符
f.close() # 关闭文件对象
3.2 write()
write() 函数可以将字符串写入一个文件对象,用法如下:
file_object.write(string)
f= open("test.txt",'a+') # 打开文件
f.write('\nhello,man!') # 写入字符
f.close() # 关闭文件
此时文件内容:
hello world!
hello everyone!
hello,man!
3.3 close()
文件对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。在读写完毕后,不能忘记 close() 文件对象;用法如下:
file_object.close() # 文件对象被释放,即文件被关闭;
4. 游标位置
4.1 tell()方法
tell() 方法可以返回游标的当前位置,用法如下:
file_object.tell()
举例:
f = open("test.txt",'r+')
str1=f.read(10)
p=f.tell()
print('当前字符的位置:',p) # 当前字符的位置: 10
f.close()
4.2 seek()方法
seek() 方法可以设置游标的当前位置,用法如下:
file_object.seek(offset [,from])
- Offset:表示要移动的字节数。
- From:指定开始移动字节的参考位置。该值的设置值如下:
- 0:文件的开头作为移动字节的参考位置;
- 1:当前的位置作为参考位置;
- 2:文件的末尾将作为参考位置。
举例:
f = open("test.txt",'r+')
str1=f.read(10)
p=f.tell()
print('当前字符的位置:',p) # 当前字符的位置: 10
f.seek(0,0) # 修改游标的位置
p=f.tell()
print('当前字符的位置:',p) # 当前字符的位置: 0
f.close()
5. Shutil 模块(文件的复制,重命名,移动,删除)
5.1 复制文件
复制文件时,可以使用 shutil.copy(source,destination) 函数;复制的同时,如果目标路径中包含文件名,可以修改文件的名称;用法如下:
d = shutil.copy(source,destination) # 复制一个文件source(文件),到destination的位置;返回值为新文件路径;
- source:文件或者文件夹的原路径;
- destination:目标路径;
举例:
import shutil,os
os.chdir(r'D:\')
shutil.copy(r'D:\123.txt',r'D:\document') #复制文件到指定文件夹
shutil.copy(r'D:\123.txt',r'D:\document\456.txt') #复制文件到指定文件夹并重命名为456.txt
5.2 复制文件夹
复制文件夹时,可以使用 shutil.copytree(source,destination) 函数;用法如下:
import shutil,os
os.chdir(r'D:\')
shutil.copytree(r'D:\',r'D:\document\') #复制文件夹到指定文件夹
5.3 移动文件 & 文件夹
与复制的使用方法完全一致,只要复制完成后,删除源文件即可;
5.4 删除文件 & 文件夹 (删除后,不会出现在垃圾箱,不建议使用)
- 删除文件,使用 os.unlink(path) ,只能删除文件;
- 删除文件夹,使用 os.rmdir(path),只能删除空文件夹;
- 删除文件 & 文件夹,使用 shutil.rmtree(path),可以删除文件夹 & 文件夹中的文件;
os.unlink(path) # 将 path 处的文件删除;
os.rmdir(path) # 将 path 处的文件夹删除;文件夹必须为空;
shutil.rmtree(path) # 将 path 处的文件夹删除,包含其中的文件,文件夹
举例:删除指定文件夹内的所有的 .xml 文件;(备注:此处只便利了一层,如果需要深层次的删除,需要使用walk()函数)
# 删除指定文件夹内的所有的 .xml 文件
import os
os.chdir(r'D:\Learning Material\Python\Sample')
for filename in os.listdir(): # 只能列出文件夹的文件或文件夹,无法包含子文件夹的内容;
if filename.endswith('.XML'):
os.unlink(filename)
举例:删除指定文件夹内的所有的 .xml 文件;(深度删除)
import os
oldDocDir = r'D:\Learning Material\Python\Sample'
for foldername, subfolders, filenames in os.walk(oldDocDir):
for filename in filenames:
if filename.endswith('.XML'):
os.unlink(filename)
5.5 删除文件 & 文件夹 (会出现在垃圾箱,建议使用)
使用第三方模块 send2trach,比python常规的删除安全的多;会将删除的东西发送到垃圾桶;path为需要删除的路径;
import send2trash
send2trash.send2trash(path)