侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Python基础(9)之文件操作

zze
zze
2019-02-24 / 0 评论 / 0 点赞 / 395 阅读 / 14342 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

open() 打开文件

Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。
你必须先用 Python 内置的 open() 函数打开一个文件,open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

open(file, mode='r')

创建一个 file 对象,相关的方法才可以调用它进行读写。
完整的语法格式为:

file object = open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

各个参数的描述如下:

  • file_namefile_name 变量是一个包含了你要访问的文件名称的字符串值。
  • access_modeaccess_mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
  • buffering:如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
  • encoding:一般使用 utf8;
  • errors:报错级别,为 strict 时表示字符编码出现问题时会报错,为 ignore 时表示字符编码出现问题时程序会忽略而过,继续执行下面的程序;
  • newline:区分换行符;
  • closefd:传入的 file 参数类型,为 True 时要求传入的 file 参数为文件的文件名,为 False 时要求传入的 file 参数只能是文件描述符;
  • opener:用不上;

文件描述符:就是一个非负整数,在 Unix 内核的系统中,打开一个文件,便会返回一个文件描述符。

要使用不同模式打开文件的可取值列表如下:

模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

下图很好的总结了这几种模式:

image.png

模式rr+ww+aa+
+++ +
+++++
创建++++
覆盖++
指针在开始++++
指针在结尾++

file 对象的属性

一个文件被打开后,你有一个 file 对象,你可以得到有关该文件的各种信息。
以下是和 file 对象相关的属性的列表:

属性描述
file.closed返回 True如果文件已被关闭,否则返回 False
file.mode返回被打开文件的访问模式。
file.name返回文件的名称。

看如下示例:

fo = open("foo.txt", "w")
print("文件名: ", fo.name)
print( "是否已关闭 : ", fo.closed)
print ("访问模式 : ", fo.mode)

'''python
文件名:  foo.txt
是否已关闭 :  False
访问模式 :  w
'''

下面是 file 对象中可用的方法列表:

方法 描述
file.close() 关闭文件,关闭后文件不能再进行读写操作。
file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如 os 模块的 read 方法等一些底层操作上。
file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。
file.next() 返回文件下一行。
file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。
file.readline([size]) 读取整行,包括 '\n' 字符。
file.readlines([sizeint]) 读取所有行并返回列表,若给定 sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。
file.seek(offset[, whence]) 设置文件指针当前位置。
file.tell() 返回文件指针当前位置。
file.truncate([size]) 截取文件,截取的字节通过size指定,默认为当前文件位置。
file.write(str) 将字符串写入文件,返回的是写入的字符长度。
file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

file.close() 关闭文件

File 对象的 close() 方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close() 方法关闭文件是一个很好的习惯。
语法:

fileObject.close()

例:

# 打开一个文件
fo = open("foo.txt", "w")
print("文件名: ", fo.name)

# 关闭打开的文件
fo.close()
'''
文件名:  foo.txt
'''

file.write() 写文件

write() 方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python 字符串可以是二进制数据,而不是仅仅是文字。
write() 方法不会在字符串的结尾添加换行符('\n')。
语法:

fileObject.write(stringOrBytes)

在这里,被传递的参数是要写入到已打开文件的内容。
例子:

# 打开一个文件
fo = open("foo.txt", "w")
fo.write("zze.xyz\n")

# 关闭打开的文件
fo.close()

上述方法会创建 foo.txt 文件,并将收到的内容写入该文件,并最终关闭文件。如果你打开这个文件,将看到以下内容:

$ cat foo.txt 
zze.xyz

file.read() 读文件

read() 方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

语法:

fileObject.read([count])

在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入 count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。

例子:
这里我们用到以上创建的 foo.txt 文件。

# 打开一个文件
fo = open("foo.txt", "r+")
str = fo.read(5)
print("读取的字符串是 : ", str)
# 关闭打开的文件
fo.close()

'''
读取的字符串是 :  zze.x
'''

file.tell() & file.seek() 文件定位

tell() 方法告诉你文件内指针的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。
seek(offset [,from]) 方法改变当前文件指针的位置。offset 变量表示要移动的字节数。from 变量指定开始移动字节的参考位置。
如果 from 被设为 0,这意味着将文件的开头作为移动字节的参考位置。如果设为 1,则使用当前的位置作为参考位置。如果它被设为 2,那么该文件的末尾将作为参考位置。
例子:
就用我们上面创建的文件 foo.txt

# 打开一个文件
fo = open("foo.txt", "r+")
str = fo.read(5)
print("读取的字符串是 : ", str)

# 查找当前位置
position = fo.tell()
print("当前文件位置 : ", position)

# 把指针再次重新定位到文件开头
position = fo.seek(0, 0)
str = fo.read(10)
print("重新读取字符串 : ", str)
# 关闭打开的文件
fo.close()

'''
读取的字符串是 :  zze.x
当前文件位置 :  5
重新读取字符串 :  zze.xyz
'''

重命名和删除文件

Python 的 os 模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。
要使用这个模块,你必须先导入它,然后才可以调用相关的各种功能。

os.rename() 重命名

rename() 方法需要两个参数,当前的文件名和新文件名。
语法:

os.rename(current_file_name, new_file_name)

例:下例将重命名一个已经存在的文件 1.txt

import os

# 1.txt 到 test1.txt。
os.rename("1.txt", "test1.txt")

还可以使用 shutil.move(current_file_name, new_file_name) 方法重命名或移动文件,参数同 os.rename() 方法。

os.remove() 删除

你可以用 os.remove() 方法删除文件,需要提供要删除的文件名作为参数。
语法:

os.remove(file_name)

例:下例将删除一个已经存在的文件 test2.txt

import os

# 删除一个已经存在的文件test2.txt
os.remove("test2.txt")

目录操作

所有文件都包含在各个不同的目录下,不过 Python 也能轻松处理。os 模块有许多方法能帮你创建,删除和更改目录。

os.mkdir() 创建目录

可以使用 os 模块的 mkdir() 方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。
语法:

os.mkdir("newdir")

例:下例将在当前目录下创建一个新目录 test

import os

# 创建目录test
os.mkdir("test")

os.chdir() 切换目录

可以用 os.chdir() 方法来改变当前的工作目录。os.chdir() 方法需要的一个参数是你想设成当前目录的目录名称。
语法:

os.chdir("newdir")

例:下例将进入 /Users/zhangzhongen/ 目录。

import os

# 将当前目录改为"/Users/zhangzhongen"
os.chdir("/Users/zhangzhongen")
# 在该目录下创建一个 test.txt 文件
with open('test.txt','w') as f:
    f.write('test chdir')

os.getcwd() 获取当前目录

os.getcwd() 方法可以显示当前的工作目录。
语法:

os.getcwd()

例:下例给出当前目录。

import os

# 给出当前的目录
print(os.getcwd())

os.rmdir() 删除目录

rmdir() 方法删除目录,目录名称以参数传递。
在删除这个目录之前,它的所有内容应该先被清除。
语法:

os.rmdir('dirname')

例:以下是删除 /tmp/test 目录的例子。目录的完全合规的名称必须被给出,否则会在当前目录下搜索该目录。

import os

# 删除”/tmp/test”目录
os.rmdir("/tmp/test")
0

评论区