文件操作

python内置函数open会创建一个python文件内置对象,作为计算机上的一个文件链接(文件句柄)。

读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()
但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:
with open('/path/to/file', 'r') as f:
    print(f.read())

调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

你可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:

with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')

要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码


关于read()方法: 1、读取整个文件,将文件内容放到一个字符串变量中 2、如果文件大于可用内存,不可能使用这种处理

关于readline()方法:
1、readline()每次读取一行,比readlines()慢得多
2、readline()返回的是一个字符串对象,保存当前行的内容
关于readlines()方法:
1、一次性读取整个文件。
2、自动将文件内容分析成一个行的列表。
file_object2 = open("test.py",'r')#以读方式打开文件
result = list()
try:
    lines = file_object2.readlines()
    print ("type(lines)=", type(lines)) # type(lines)= <type 'list'>
    for line in lines:  # 依次读取每行
        line = line.strip()  # 去掉每行头尾空白
        if not len(line) or line.startswith('#'):  # 判断是否是空行或注释行
            continue  # 是的话,跳过不处理
        result.append(line)  # 保存
    result.sort()  # 排序结果
    print(result)
finally:
    file_object2.close()
open('test_result.py', 'w').write('%s' % '\n'.join(result)) #保存入结果文件
====文件打开方式
打开方式 s说明
r  
w  
r+ 可读可写,若文件不存在,报错。调用open函数初始动作不会清空文件内容
w+

指可以读取新写的内容,可读可写,若文件不存在,创建。但是一旦调用open函数则首先将内容清空。

这个模式最没什么用

   
   
   
   
   












====seek()方法
Python中的seek函数作用是: 移动文件的读取指针到指定位置。seek函数需要使用文件对象进行调用,无返回值。
参考:https://www.aliyun.com/jiaocheng/520002.html

seek函数有三种模式:

1) f.seek(p, 0) 或 f.seek(p)

将文件读取指针移动到文件的第p个字节处,表示绝对位置。f.seek(0)移动到文件头位置。

2) f.seek(p, 1)

在当前位置的基础上,将文件读取指针移动p个字节,表示相对位置。

3) f.seek(p, 2)

在文件尾的基础上,将文件读取指针移动p个字节,表示相对位置。f.seek(0, 2)移动到文件尾位置。、

 

f.read(x):这里的x代表是以字符为单位进行读取

f.seek()、f.tell()代表是以字节为单位


https://blog.csdn.net/isoleo/article/details/24412171
seek(offset,where):  offset:偏移量,移动字节数(单个字符)。where=0从起始位置移动,1从当前位置移动,2从结束位置移动。当有换行时,会被换行截断。seek()无返回值,故值为None。



https://www.cnblogs.com/zhouxinfei/p/8018275.html  参考

https://www.cnblogs.com/ymjyqsx/p/6554817.html

posted @ 2018-05-01 01:07  念宗  阅读(124)  评论(0编辑  收藏  举报