【Python基础学习】第十二节 文件操作

时间:2022-10-24 13:55:01

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)