python文件操作

来源:互联网 发布:dnf数据芯片要刷全图吗 编辑:程序博客网 时间:2024/05/24 03:21

python文件操作

说明:适用python2

1. 文件打开与关闭

函数

open()close()

函数说明及使用

  格式:open(name[, mode[, buffering]]) -> file object  参数:   namefile name  mode:        r   只读方式打开文件,如果文件不存在,报错。默认参数。        w   只写方式打开文件,如果原文件存在,则原文件的内容清空;若原文件不存在,新建立一个。        a   写入的内容追加到文件末尾。        b   二进制方式操作文件        r+  读写方式打开文件。若写入行数少于原文件行数,会造成前面的为写入的新行,后面的为原来的内容。若文件不存在,报错。        w+  读写方式打开文件。会清掉原文件内容。若文件不存在,创建新文件

文件打开实例

\#常规示例f = open("a.txt", "r")print f.read()f.close()注: 文件打开后一定要调用close关闭

下面是两种打开文件的常用方式。第一种方式,即使文件操作出现错误,使用try…finall也可以关闭文件。另外python引入了with语句,可以自动地调用close方法。

\# 常用方式一try:    f = open("a.txt", "r")    print f.read()finally:    if f:        f.close()\# 常用方式二:with open("a.txt", "r") as f:    print f.read()

易出错操作

这个会使读到的文件内容出现乱码,而且原始文件也会破坏掉。

f=open('a.txt','a+')  f.write('123')  f.read()  f.close()  

a+方式追加文件,文件的指针在文件末尾,再读取文件操作时,会一直向后读取,直到碰到EOF为止。
详细见: http://blog.csdn.net/ztf312/article/details/47259805

2.读文件内容

函数

"""下面中的三个函数都含有size参数,但是一般不使用"""read([size]) -> read at most size bytes, returned as a string.readline([size]) -> next line from the file, as a string.readlines([size]) -> list of strings, each a line from the file.xreadlines() -> returns self.   

read([size])

  • 参数:size:如果这个参数不写或者值为负值,那么会一直读文件,直到文件的EOF标志。也就是说会把文件的内容都读进来,但是如果文件的内容大于内存,则不会读进去数据。
  • 返回值:字符串(str)

a.txt的文件内容为(下面例子中a.txt保持为这个内容):

line1line2
 #常用于读取整个文件内容with open("a.txt", "r") as f:    print f.read()    #读取文件全部内容并打印

也可以指定读取指定个数的字符

with open("a.txt", "r") as f:    i = f.read(9)    print i+"-01"    i = f.read(9)    print i+"-02"    i = f.read(9)    print i+"-03"    i = f.read(9)    print i+"-04""""输出为:line1lin-01e2-02-03-04"""

从指定读取个数字符的输出来看,

  • 第一次读取9个字符,包含’\n’字符。
  • 第二次读取时,由于不足9个字符,那么只读取剩下的几个字符。
  • 第三次,第四次读取,其实返回的都是EOF。

readline([size])

参数:可选,指定读入的字节数。这个参数一般不用。如果省略这个参数,是指读一整行数据,包括换行符
返回值:str,包含换行符

with open("a.txt", "r") as f:    i = f.readline()    print i+"-01""""输出为:line1-01"""

使用size参数

with open("a.txt", "r") as f:    i = f.readline(2)    print i+"-01"    i = f.readline(9)    print i+"-02""""a.txt的内容同上。输出的结果为:li-01ne1-02"""

分析:a每行的长度为6(包含换行符)。在指定2参数时,输出了第一行的前两个字符。在第二次调用,指定参数等于9时,从刚才的位置继承读取,但是并没有读到第二行,也就是说读到了换行符就结束了。因此,如果指定的数字大于行的长度,那么也会读一整行的内容。

readlines([size])

返回:一个字符串的list

print "start"with open("a.txt") as file:    print file.readlines()print "end""""输出为:start['line1\n', 'line2']end"""

如果指定了size的大小,那么在调用 readlines(size) 函数,会返回大约size字节的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 size指定的值大一点(除最后一次调用 readlines(size) 函数的时候)。通常情况下,Python 会自动将用户指定的 size的值调整成内部缓存大小的整数倍。
例如,我的机器上的缓存大小是8k,而a.txt的只有11个字符(算是换行符),因此,指定参数的话指定1后者2或者3,其实效果都是一样的,只有在读到大的文件的时候才会看到效果,这里不举例子了。

循环读文件内容

对file对象操作

在Python 2.2以后,我们可以直接对一个file对象使用for循环读每行数据

print "start"file = open("a.txt")num = 0for line in file:    num += 1    print line + "-" + str(num) #do somethingfile.close()print "end""""输出为:startline1-1line2-2end"""

分析:读入的每行内容是带有换行符的,因此第一行(“line1”)的”-1”在下一行显示,第二行(“line2”)由于不带有换行符,因此显示为”line2-2”。
更常用的使用方式一般用方法strip去掉末尾的换行符:

print "start"file = open("a.txt")num = 0for line in file:    num += 1    line = line.strip('\n')    print line + "-" + str(num) #do somethingprint "end""""startline1-1line2-2end"""

通过readlines()进行操作

print "start"with open("a.txt") as file:    lines = file.readlines()    for line in lines:        line = line.strip('\n')        print lineprint "end""""输出:startline1line2end"""

使用readline进行

这种方法写起来比较麻烦,

print "start"with open("a.txt") as file:    while 1:        line = file.readline()        if not line:            break        line = line.strip('\n')        print line # do somethingprint "end"

带缓存的文件的读取

在读取大文件时,可以指定readline或者readlines的参数,就可以不断地读取文件了

print "start"with open("a.txt") as file:    while 1:        line = file.readlines(10)        if not line:            break        line = line.strip('\n')        print line # do somethingprint "end"

3.写文件内容

函数

write(str) -> None.  Write string str to file.writelines(sequence_of_strings) -> None.  Write the strings to the file.

4.其他操作

函数

seek(offset[, whence]) -> None.  Move to new file position.tell() -> current file position, an integer (may be a long integer).flush() -> None.  Flush the internal I/O buffer.x.next() -> the next value, or raise StopIteration