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