Python文件操作常用方法
1.打开文件
语法如下:
file_object = open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
➢ file:文件名称。
➢mode:制定了文件打开的方式,函数提供了如下方式,其中,'rt'为默认 方式。
➢buffering:如果buffering的值被设置为0,就不会有缓存;如果值为1, 访问文件时会缓存行;如果值位大于1的整数,表明了这就是寄存区的缓冲 大小;如果取负值,寄存区的缓冲大小则为系统默认。该参数也是非强制性 的。
➢encoding:编码或者解码方式。默认编码方式依赖平台,如果需要特殊设置,可以参考codecs模块,获取编码列表。
➢errors:可选,并且不能用于二进制模式,指定了编码错误的处理方式, 可以通过codecs.Codec获得编码错误字符串
➢newline:换行控制,参数有:None,'\n','\r','\r\n'。 输入时,如果参数为None,那么行结束的标志可以是:'\n','\r','\r\n'任 意一个,并且三个控制符都首先会被转化为:'\n',然后才会被调用; 如果参数为'',所有的通用的换行结束标志都可以用,但是行结束标识符返 回调用不会被编码。输出时,如果参数为None,那么行结束的标志可以是: '\n'被转换为系统默认的分隔符;如果是'','\n'则不会被编码。
➢closefd:false:文件关闭时,底层文件描述符仍然为打开状态,这是不 被允许的,所以,需要设置为ture
➢opener:可以通过调用*opener*方式,使用自定义的开启器。底层文件 描述符是通过调用*opener*或者*file*, *flags*获得的。
➢*opener*必须返回一个打开的文件描述。将os.open作为*opener*的结 果,在功能上,类似于通过None。
实例1:
fp = open("e:\\pyScripts\\testfile.txt","r")
print(type(fp)) >>> <class '_io.TextIOWrapper'>
fp.close()
实例2:
with方式打开文件:会默认关闭文件
>>> with open("e:\\pyScripts\\sample2.txt","r",encoding="utf-8") as fp:
... for line in fp:
... print(line)
...
line 1
line 2
line 3
文件的操作模式
模式 | 描述 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新 文件 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容 将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是 说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加 模式。如果该文件不存在,创建新文件用于读写 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该 文件不存在,创建新文件用于读写 |
2.读文件
fileObject.read([size])
size为读取的长度,以byte为单位。如果不指定参数,表示一次性读取全部内容,以字符串形式返回,并且每一行结尾会有一个"\n"符号。
>>> fp = open("e:\\pyScripts\\sample2.txt")
>>> fp.tell()
0
>>> fp.read()
'test1\ntest2\n\ntest3\n'
>>> fp.tell()
23
>>> fp.close()
>>> fp = open("e:\\pyScripts\\sample2.txt")
>>> fp.read(8)
'test1\nte'
>>> fp.tell()
9
>>> fp.close()
fileObject.readline([size])
读取当前行的内容,以字符串的形式返回,并且结尾有换行符'\n'。读完一行,文件操作标记移动到下一行的 开头。指定参数,若参数<=当前行的字节数,返回该参数指定的字节数。若参数>当前行的字节数,返回当前行的内容。读完所有行再执行该函数,返回空字符串
>>> fp = open("e:\\pyScripts\\sample2.txt")
>>> fp.readline()
'test1\n'
>>> fp.tell()
7
>>> fp.readline()
'test2\n'
>>> fp.readline()
''
>>> fp.close()
>>> fp = open("e:\\pyScripts\\sample2.txt")
>>> fp.readline(4)
'test'
>>> fp.seek(0,0)
0
>>> fp.readline(7)
'test1\n'
>>> fp.seek(0,0)
0
>>> fp.readline(10)
'test1\n'
>>> fp.close()
fileObject.readlines( [size] )
把文件每一行作为一个list的一个成员,类型是一个字符串,并且结尾会有 一个换行符"\n",并返回这个list。这个函数的内部是通过循环调用 readline()来实现的。
>>> fp = open("e:\\pyScripts\\sample2.txt")
>>> fp.readlines()
['test1\n', 'test2\n', '\n', 'test3\n']
>>> fp.seek(0,0)
0
>>> fp.readlines(5)
['test1\n']
>>> fp.seek(0,0)
0
>>> fp.readlines(8)
['test1\n', 'test2\n']
>>> fp.seek(0,0)
3.写文件
fileObject.write( str )
将str写入文件中,如需换行的话,手动加换行符'\n'
with open("e:\\pyScripts\\sample2.txt","w") as fp:
fp.write('test10201\ntest10202')
fileObject.writelines(seq)
把seq(序列)的内容全部写到文件中(多行一次性写入),也不会自动加入换行符。
序列中的元素必须是字符串
with open("e:\\pyScripts\\sample2.txt","w") as fp:
testList = ['test01\n','test02\n','test03\n']
fp.writelines(testList)
4.其他常用操作
fileObject.tell()-----返回文件操作的当前位置
test02.py
>>>fp = open("e:\\pyScripts\\sample2.txt","r")
>>>print("初始化文件读取的当前位置:",fp.tell())
初始化文件读取的当前位置: 0
>>>print("读取文件的行内容:",fp.readline())
读取文件的行内容: test01
>>>print("读取该行后文件操作的当前位置:",fp.tell())
读取该行后文件操作的当前位置: 8
>>>fp.close()
fileObject.seek( offset[, from ] )---该方法是改变当前文件的位置
offset变量表示要移动的字节数。
from变量指定开始移动字节的参考位置。0--代表从文件的开头移动,1--代表从文件的当前位置移动,2--代表从文件的末尾移动
注意:如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
test02.py
>>>fp = open("e:\\pyScripts\\sample2.txt","r")
>>>print("初始化文件读取的当前位置:",fp.tell())
初始化文件读取的当前位置: 0
>>>print("读取文件的行内容:",fp.readline())
读取文件的行内容: test01
>>>print("读取该行后文件操作的当前位置:",fp.tell())
读取该行后文件操作的当前位置: 8
>>>fp.seek(0,2)
>>>print("fp.seek(0,2)后回到文件的末尾位置:",fp.tell())
fp.seek(0,2)回到文件的初始位置: 52
>>>fp.seek(0,0)
>>>print("fp.seek(0,0)后回到文件的初始位置:",fp.tell())
fp.seek(0,0)回到文件的初始位置: 0
>>>fp.close()
fileObject.truncate( [size] )---把文件裁剪成规定的大小,默认的是裁到当前文件操作标记的位置。
>>> fp=open("e:\\pyScripts\\sample1.txt","r+")
>>> fp.truncate(2)
2
>>> fp.seek(0,0)
0
>>> fp.read()
'te'
>>> fp.close()
fileObject.flush()---将缓冲区的内容写入磁盘
>>> fp=open("e:\\pyScripts\\sample2.txt","w+")
>>> fp.writelines(testList)
>>> fp.flush()
>>> fp1=open("e:\\pyScripts\\sample2.txt","r")
>>> fp1.read()
'test01\ntest02\ntest03\n'
>>> fp.close()
>>> fp1.close()
fileObject.fileno()---返回一个长整型的文件标签
>>> fp=open("e:\\pyScripts\\sample1.txt","r")
>>> fp.fileno()
3
>>> fp1=open("e:\\pyScripts\\sample2.txt","r")
>>> fp1.fileno()
4
>>> fp.close()
>>> fp1.close()
5.文件的常见属性
fp = open("e:\\pyScripts\\sample2.txt")
print("文件是否关闭:",fp.closed)
print("文件的访问模式:",fp.mode)
print("文件名称:",fp.name)
fp.close()
6.小练习
删除文件中的空行
# 解法1:
fp=open("e:\\pyScripts\\sample1.txt","r")
lst=fp.readlines()
result=[]
for i in lst:
if i !="\n":
result.append(i)
fp.close()
fp=open("e:\\pyScripts\\sample2.txt","w+")
fp.writelines(result)
fp.close()
# 解法2:
fp=open("e:\\a.txt","r+")
lines= fp.readlines()
fp.seek(0,0)
for line in lines:
if line.strip():
fp.write(line)
fp.close()