文件操作:
打开文件:
Python内置了一个打开文件的函数,open()函数,用来打开一个文件,返回新打开文件的描述符,然后就可以对该打开的文件做任何你想做的操作。
语法: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获得编码错误字符串
➢mode:制定了文件打开的方式,函数提供了如下方式,其中,'rt'为默认方式。
➢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。
打开方式一:
代码示例:
fp = open( "c:\\downloads\\ip1.txt",'w+') --python内打开文件
print(type(fp))
print (fp)
fp.write("glory road is great!") --文件内写入内容
fp.close() --关闭打开的文件
打开方式二:
with 方式打开文件:会默认关闭文件
代码示例:
with open("c:\\downloads\\ip1.txt",'r’) as f:
for line in f: --打开文件内置循环,浏览所有内容
print (line)
文件操作模式:
r --以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
r+ --打开一个文件用于读写。文件指针将会放在文件的开头。
w --打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+ --打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a --打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ --打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
文件对象:
file.closed --返回true如果文件已被关闭,否则返回false。
file.mode --返回被打开文件的访问模式。
file.name --返回文件的名称。
代码示例:
fp = open( "c:\\downloads\\ip1.txt",'w')
print ("文件是否关闭:", fp.closed)
print ("文件的访问模式:", fp.mode)
print ("文件名称:", fp.name)
fp.close()
文件操作常用方法:
一、fileObject.read([size])
size为读取的长度,以byte为单位。如果不指定参数,表示一次性读取全部内容,以字符串形式返回,并且每一行结尾会有一个"\n"符号。
代码示例1:
fp = open( "c:\\ file.txt",'r')
content = fp.read()
print ("读取的文件内容如下:\n",content)
fp.close()
代码示例2:
fp = open( "c:\\file.txt",'r')
content = fp.read(5)
print ("读取的文件内容如下:\n", content)
fp.close()
二、fileObject.read([size])
size为读取的长度,以byte为单位。如果不指定参数,表示一次性读取全部内容,以字符串形式返回,并且每一行结尾会有一个"\n"符号。
代码示例1:
fp = open( "c:\\ file.txt",'r')
content = fp.read()
print ("读取的文件内容如下:\n",content)
fp.close()
代码示例2:
fp = open( "c:\\file.txt",'r')
content = fp.read(5)
print ("读取的文件内容如下:\n", content)
fp.close()
三、fileObject.readline( [size] )
一行,如果给定了size,有可能返回的只是一行的一部分,以字符串的形式返回,并且结尾会有一个换行符"\n"。读完一行,文件操作标记移动到下一行的开头。
代码示例1:
fp = open( "c:\\file.txt",'r')
content = fp.readline()
print ("读取的文件内容如下:\n", content)
fp.close()
代码示例2:
fp = open( "c:\\file.txt",'r')
content = fp.readline(5)
print ("读取的文件内容如下:\n", content)
fp.close()
四、fileObject.readlines( [size] )
把文件每一行作为一个list的一个成员,是一个字符串,并且结尾会有一个换行符"\n",并返回这个list。这个函数的内部是通过循环调用readline()来实现的。如果指定了size参数,表示读取文件指定内容的长度,此时就有可能只能读取文件的一部分,并且结尾会有一个换行符"\n"。
注:指定很小的数字,会不生效,python 默认8k缓存区大小,需要大于8k生效
代码示例:
fp = open( "c:\\file.txt",'r')
contentList = fp.readlines()
print ("读取文件的内容:\n", contentList)
for i in contentList :
print (i)
fp.close()
五、fileObject.write( str )
把str写到文件中,默认是不加换行符的,所以如果想换行的话,得手动加入换行符'\n'。
代码示例:
fp = open( "c:\\test.txt",'w')
fp.write('文件写入测试' + '\n')
fp.close()
六、fileObject.writelines( seq )
把seq(序列)的内容全部写到文件中(多行一次性写入)。也不会自动加入换行符。
代码示例:
testList = ['abcede\n', '123\n', 'this is a test', '文件操作']
fp = open( "c:\\test.txt",'w') --打开文件准备写文件
fp.writelines( testList ) --将列表testList所有内容一次全部写入文件
fp.close()
注意:序列中的内容也必须是字符串类型的数据,才能成功写入文件。
七、fileObject.flush()
该函数是将缓冲区中的内容写入硬盘。
代码示例:
testList = ['test1\n', 'test2\n', 'test3', '文件操作']
fp = open( "c:\\downloads\\ip2.txt",'w+')
print (fp.read(),end="\n")
fp.writelines(testList)
fp.flush()
fp1 = open( "c:\\downloads\\ip2.txt",'r')
print (fp1.read(),end="\n")
fp.close()
fp1.close()
八、fileObject.fileno()
返回一个长整型的文件标签。
代码示例:
fp = open( "c:\\test.txt",'r')
print (fp.fileno())
fp.close()
九、fileObject.isatty()
文件是否是一个终端设备文件(unix)系统中的。
代码示例:
fp = open( "c:\\test.txt",'r')
print (fp.isatty())
fp.close()
十、fileObject.tell()
返回文件操作标记的当前位置,以文件的开头为基准点。
代码示例:
fp = open( "c:\\test.txt",'r')
print ("当前文件操作标记位置为:", fp.tell() )
line = fp.readline()
print ("读取一行后文件操作标记位置为:", fp.tell())
fp.close()
十一、fileObject.seek( offset[, from ] )
tell()方法告诉你文件内的当前位置;换句话说,下一次的读写会发生在文件开头这么多字节之后。seek(offset [,from])这是一个文件定位函数,该方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。如果from被设为0(默认值),这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。测试文件test.txt,内容如下:
代码示例:
fp = open(r"c:\test.txt", "r+")
str = fp.read(16) --读取长度为16个字节的内容
print (u"读取的字符串是 : ", str)
position = fp.tell() --查找当前位置
print ("当前文件位置 : ", position)
position = fp.seek(0, 0) --把指针再次重新定位到文件开头
str = fp.read(16)
print ("重新读取字符串 : ", str)
fp.close()
删除空行的方法:
方法1:
import os
def delblankline(infile, outfile):
""" Delete blanklines of infile """
infp = open(infile, "r")
outfp = open(outfile, "w")
lines = infp.readlines()
for li in lines:
if li.split():
outfp.write(li)
infp.close()
outfp.close()
方法2:
fp = open(r'test.txt')
aList = []
for item in fp:
if item.strip():
aList.append(item)
fp.close()
fp = open(r'test2.txt','w')
fp.writelines(aList)
fp.close()
文件操作练习题
文件内容:
glory road ,wu lao shi
file,haha
women, man, love
练习题1:同时读写文件
练习题2:创建一个空文件
练习题3:读取文件的前两行
练习题4:读取文件的奇数行
练习题5:在文件中写入一个列表的内容
练习题6:在文件中的0、2、4位置写入当前的文件位置偏移量
练习题7:with写法读取文件内容
练习题8:统计一个文件中单词个数
练习题9:将一个文件的所有单词倒序写入文件中