Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。 open 函数
必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | X | X | X | X | ||
写 | X | X | X | X | X | |
创建 | X | X | X | X | ||
覆盖 | X | X | ||||
指针在开始 | X | X | X | X | ||
指针在结尾 | X | X |
file 对象使用 open 函数来创建:
参数1: 文件名:(如果要是直接写在脚本内最好是文件的绝对路劲)
参数2: option: r 读 w 写 b二进制 a追加
ENCODING = "utf-8" //全局变量,定义字符类型
fw = open("333.txt", "w", encoding=ENCODING) //格式
fw.write("first lines\n这是第二行\nthird lines\nthis is fourth lines\nthis is fifth lines\n")
print(fw)
文件1.txt中的内容为:
first lines
这是第二行
third lines
this is fourth lines
this is fifth lines
fr = open("333.txt", "r", encoding=ENCODING)
fr = fr.readlines()
print(fr)
输出的内容:
['first lines\n', '这是第二行\n', 'third lines\n', 'this is fourth lines\n', 'this is fifth lines\n', '\n']
也就是说:当读一个文件的时候,会强制的将每行的内容转换为list的形式来展现出来(包括每行的换行符)。
fr = open("333.txt", "a", encoding=ENCODING)
fr.write("\nthis is sixth lines.\n")
fr.close()
文件内容:
first lines
这是第二行
third lines
this is fourth lines
this is fifth lines
this is sixth lines.
当然我们细看最后一行,有个参数,fr.close(); 因为文件的操作,分为三个步骤:
所以一个规范且有完整的操作,包含如上三个步骤。
一旦文件被打开,则就会有一个文件对象,你就可以得到有关该文件的各种信息。
这里是一个文件对象相关的所有属性的列表:
属性 | 描述 |
---|---|
file.closed | 如果文件被关闭返回true,否则为false |
file.mode | 返回文件打开访问模式 |
file.name | 返回文件名 |
示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 4/12/2018 8:53 PM
# @Author : zhdya
# @File : demon1.py
fr = open("333.txt", "r", encoding=ENCODING)
print("name of file: ", fr.name)
print("name of permission: ", fr.mode)
print("if closed or not: ", fr.closed)
fr.close()
输出:
name of file: 333.txt
name of permission: r
if closed or not: False
正常的工作环境中,我们一般不使用如上的步骤,但是基础学习还是有必要的,因为在日常的工作中,我们常常会忘记关闭文件,导致错误。
所以就用到了如下“自动化开启→操作→关闭”
方法 | 描述 |
---|---|
file.close() | 关闭文件。关闭后文件不能再进行读写操作。 |
file.flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
file.fileno() | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
file.next() | 返回文件下一行。 |
file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
file.readline([size]) | 读取整行,包括 “\n” 字符。 |
file.readlines([sizeint]) | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
file.seek(offset[, whence]) | 设置文件当前位置 |
file.tell() | 返回文件当前位置。 |
file.truncate([size]) | 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
继续接着上面的333.txt
在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入
with open("333.txt", "r", encoding=ENCODING) as f:
f = f.read(10)
print(f)
输出:
first line
把字符串data写入到文件中,只接受字符串参数
with open("333.txt", "w", encoding=ENCODING) as f:
f.write("this is sss lines\nasdasdasd\n")
print(f)
再次查看文件内容:
this is sss lines
asdasdasd
这样就验证了,之前所说的,w操作会覆盖原有的文件!需要谨慎!!
每次读取文件一行数据,返回每行的字符串数据
只返回第一行的内容
with open("333.txt", "r+", encoding=ENCODING) as f:
f.write("this is sss lines\nasdasdasd\n")
f = f.readline()
print(f)
输出:
this is sss lines
注意如上mode的变化 r+
文件内容变化:
this is sss lines
asdasdasd
this is sss lines
asdasdasd
读取文件内容,返回一个list,每一行是一个元素
with open("333.txt", "r+", encoding=ENCODING) as f:
f.write("this is sss lines\nasdasdasd\n")
f = f.readlines()
print(f)
输出:
['this is sss lines\n', 'asdasdasd\n', 'this is sss lines\n', 'asdasdasd\n']
还是一贯的养成一个好的习惯,在操作文件的时候在最顶处直接添加全局变量:
全局变量:也要养成好的习惯 全局变量均 全部字符为大写。
ENCODING = "utf-8"
方法用于移动文件读取指针到指定位置。
格式:
fileObject.seek(offset[, whence])
该函数没有返回值。
验证这个参数 我需要重新编辑一个特殊的文件,才可以看到效果:
文件中的内容为:
1.asdadasdasdas
2.aaaaaaaaaa
3.ddddddddd
4.qweqweqwe
5.zhdyazhdya
脚本为:
with open("333.txt", "r+", encoding=ENCODING) as f:
print(f.readline())
print(f.readline())
输出:
1.asdadasdasdas
2.aaaaaaaaaa
这样也清楚了readline的工作模式!
下面我这样修改下:
with open("333.txt", "r+", encoding=ENCODING) as f:
print(f.readline())
f.seek(0,0)
print(f.readline())
输出:
1.asdadasdasdas
1.asdadasdasdas
这个就是seek的方法的功能!
返回文件光标位置
with open("333.txt", "r+", encoding=ENCODING) as f:
print(f.readline())
print(f.tell())
输出:
1.asdadasdasdas
17
还不清楚的话,就查查字符就晓得什么意思了。
只有写文件才可以用,清空文件, size表示截取的字符数。
源文件内容:
1.asdadasdasdas
2.aaaaaaaaaa
3.ddddddddd
4.qweqweqwe
5.zhdyazhdya
with open("333.txt", "r+", encoding=ENCODING) as f:
f.truncate(17)
再次查看文件内容:
1.asdadasdasdas
不加size参数:
源文件内容:
1.asdadasdasdas
2.aaaaaaaaaa
3.ddddddddd
4.qweqweqwe
5.zhdyazhdya
with open("333.txt", "r+", encoding=ENCODING) as f:
f.truncate()
直接清空了文件的内容。