python文件操作(一)基础文件操作
从本篇开始准备对python文件的操作做一个系统总结。基础文件操作包括文件的文件的读取、创建、追加、删除、清空;按行进行或字节读写文件等内容。
一、python file open方法
Python 打开文件语法为: f = open(name[, mode[, buffering]])
各字段含义:
name: 所要打开的文件的名称,
mode:打开文件的方式:
1‘r’ : 读模式
2'w' : 写模式
3'a' : 追加模式
4'b' : 二进制模式(可添加到其他模式中使用)
5'+' : 读写模式(可添加到其他模式中使用)
6'U' : 就是支持所有的换行模式,也就说‘\r’ '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。
buffering : 是否要缓冲
10 / False : 代表无缓冲
21 / True : 代表有缓冲
3大于一的数字: 代表缓冲区大小(单位是字节)
4-1 : 默认缓冲区大小
上面mode列出的是基本模式,实际应用中的扩展模式有:
1"r" 以读方式打开,只能读文件,如果文件不存在,会发生异常。
2"w" 以写方式打开,只能写文件, 如果文件不存在,创建该文件。如果文件已存在,先清空,再打开文件。
3"rb" 以二进制读方式打开,只能读文件 , 如果文件不存在,会发生异常
4"wb" 以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,先清空,再打开文件
5"rt" 以文本读方式打开,只能读文件 , 如果文件不存在,会发生异常
6"wt" 以文本写方式打开,只能写文件, 如果文件不存在,创建该文件,如果文件已存在,先清空,再打开文件 。
7"rb+" 以二进制读方式打开,可以读、写文件 , 如果文件不存在,会发生异常
8"wb+" 以二进制写方式打开,可以读、写文件, 如果文件不存在,创建该文件。如果文件已存在,先清空,再打开文件。
由于默认为 r 模式,如果文件不存在,则会发生异常提示。
二、字节读取
1、read
1f.read(num) //读出num个字节
2f.read() //读出全部字节
2、write
1f.write(string) //将string写入文件
三、行读写
1F.readline([size]) #读一行,如果定义了size,size的单位是byte,有可能返回的只是一行的一部分
2F.readlines([size]) #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
3F.write(str) #把str写到文件中,write()并不会在str后加上一个换行符
4F.writelines(seq) #把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
四、其他方法
- F.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
- F.flush() #把缓冲区的内容写入硬盘
- F.fileno() #返回一个长整型的”文件标签“
- F.isatty() #文件是否是一个终端设备文件(unix系统中的)
- F.tell() #返回文件操作标记的当前位置,以文件的开头为原点
- F.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
- F.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
- F.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
五、示例
1、读取所有内容
1file_object = open('png.sh')
2try:
3 all_the_text = file_object.read()
4 print all_the_text,type(all_the_text)
5finally:
6 file_object.close( )
2、读固定字节
1file_object = open('abinfile', 'rb')
2try:
3 while True:
4 chunk = file_object.read(100)
5 if not chunk:
6 break
7 do_something_with(chunk)
8finally:
9 file_object.close( )
3、行读取
1with open('foo.txt', 'r') as f:
2 for line in f.readlines():
3 # do_something(line)
4和
5with open('foo.txt', 'r') as f:
6 for line in f:
7 # do_something(line)
从Python 2.3开始,Python中的文件类型开始支持迭代功能,比如下面两段代码做的其实差不多:
但是,后面一种迭代占用更小的内存,而且更加智能(依赖于Python文件对象的实现),所需文件内容是自动从buffer中按照需要读取的,是值得鼓励的做法。
file.readlines()是把文件的全部内容读到内存,并解析成一个list,当文件的体积很大的时候,需要占用很多内存,使用该方法是一种不明智的做法。
还有一个file.xreadlines()方法,则直接返回一个iter(file)迭代器,在Python 2.3之后已经不推荐这种表示方法了。
4、写文件
1#写文本文件
2output = open('data', 'w')
3#写二进制文件
4output = open('data', 'wb')
5#追加写文件
6output = open('data', 'w+')
7#写数据
8file_object = open('thefile.txt', 'w')
9file_object.write(all_the_text)
10file_object.close( )
11#写入多行
12file_object.writelines(list_of_text_strings)
注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
写入文件时换行符的处理:
1sample_list = [line+'\n' for line in sample_list]
2outfile.wirtelines(sample_list)
5、综合示例
1#! /usr/bin/python
2import os,sys
3try:
4 fsock = open("D:/pytest/test.py", "r")
5except IOError:
6 print "The file don't exist, Please double check!"
7 exit()
8print 'The file mode is ',fsock.mode
9print 'The file name is ',fsock.name
10P = fsock.tell()
11print 'the postion is %d' %(P)
12fsock.close()
13#Read file
14fsock = open("D:/pytest/test.py", "r")
15AllLines = fsock.readlines()
16#Method 1
17for EachLine in fsock:
18 print EachLine
19#Method 2
20print 'Star'+'='*30
21for EachLine in AllLines:
22 print EachLine
23print 'End'+'='*30
24fsock.close()
25#write this file
26fsock = open("D:/pytest/test.py", "a")
27fsock.write("""
28#Line 1 Just for test purpose
29#Line 2 Just for test purpose
30#Line 3 Just for test purpose""")
31fsock.close()
32#check the file status
33S1 = fsock.closed
34if True == S1:
35 print 'the file is closed'
36else:
37 print 'The file donot close'
六、python读写大文件
实际应用中经常会遇到这样的情况,一台主机的物理内存只有2G,而文件大小有10G 。一次读取文件时,肯能会报memoryError错误。遇到这种问题时解决方法有两种:
文件块切割
将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。具体如下:
1def readInChunks(fileObj, chunkSize=1024*1024*200):
2 """
3 Lazy function to read a file piece by piece.
4 Default chunk size: 200MB.
5 """
6 while True:
7 data = fileObj.read(chunkSize)
8 if not data:
9 break
10 yield data
11f = open('bigFile')
12for chuck in readInChunks(f):
13 do_something(chunk)
比如上面的方法中就将文件切割成200M大小的块。再进行读取操作。
提到读,还有写大文件的问题,网上看到通过使用模块mmap 来实现。
参考页面:
stackoverflow
知乎
python中的readlines和xreadlines函数
想要了解更多,可以pydoc file 查看python file操作帮助文档。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-file-basics/4627.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.