f = open(filename, 'xxx') # 打开文件
'''这里是读写操作'''
f.close() # 关闭文件
字符 | 含义 |
---|---|
‘r’ | 以只读方式打开(默认) |
‘w’ | 以只写方式打开,删除原有文件内容(如果文件不存在,则创建该文件并以只写方式打开) |
‘x’ | 创建一个新文件, 并以写模式打开这个文件,如果文件存在则会产生”FileExistsError”错误 |
‘a’ | 以只写文件打开一个文件,如果有原文件则追加到文件末尾 |
‘b’ | 用二进制模式打开 |
‘t’ | 文本文件模式打开 (默认) |
‘+’ | 为更新内容打开一个磁盘文件 (可读可写) |
- 默认是’rt’ - ‘w+b’ 可以实现二进制随机读写,当文件打开时,文件内容被清空 - ‘r+b’ 以二进制读和更新模式打开文件,打开文件时不会清空文件内容 - ‘r+’ 以文本模式读和更新模式打开文件,打开文件时不会清空文件内容
方法 | 说明 |
---|---|
F.close() | 关闭文件(关闭后文件不能再读写会发生ValueError错误) |
F.readline() | 读取一行数据, 如果到达文件尾则返回空行 |
F.readlines(max_chars=-1) | 返回每行字符串的列表,max_chars为最大字符(或字节)数 |
F.writelines(lines) | 将字符串的列表或字符串的列表中的内容写入文件 |
二进制文件操作方法 | |
F.read(size=-1) | 从一个文件流中最多读取size个字符(文本文件)或字节(二进制文件),如果不给出参数,则默认读取文件中全部的内容并返回 |
F.write(text) | 写一个字符串到文件流中,返回写入的字符数(文本文件)或字节数(二进制文件) |
F.tell() | 返回当前文件流读写指针的绝对位置(字节为单位) |
F.seek(offset, whence=0) | 改变数据流读写指针的位置,返回新的绝对位置 |
F.flush() | 把写入文件对象的缓存内容写入到磁盘 |
如,当前有文件myfile.txt:
f = open('myfile.txt')
res = f.read()
print(res)
f.close()
输出结果是:
f = open('myfile.txt')
res = f.read(3)
print(res)
f.close()
read可以设置读取字符数: 如:
f = open('myfile.txt')
res = f.read(3)
print(res)
f.close()
打印结果:
你好!
还是以上文件myfile.txt
f = open('myfile.txt')
res = f.readline()
print(res)
f.close()
输出结果:
/usr/bin/python3.5 /home/.../myfile.py
你好! 我在文件里
还是以上文件myfile.txt
f = open('myfile.txt')
res = f.readlines()
print(res)
f.close()
输出结果:
/usr/bin/python3.5 /home/.../myfile.py
['你好! 我在文件里\n', '你好! 我在文件里\n', '你好! 我在文件里\n', '你好! 我在文件里 gh\n', '\n', '你好! 我在文件里\n']
以readlines读取的文件内容是可迭代对象,可以使用for循环遍历,或直接示意索引下标获取想要的内容
现在改了myfile的内容如下: 你好! aaa
现在以二进制的形式将这两行文字读取出来
f = open('myfile.txt', 'rb') # 打开方式使用'rb'
res = f.read()
print(res)
f.close()
结果是:
b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x81\naaa\n'
f = open('newfile.txt', 'w') # w :有则打开并覆盖原内容,没有则新建文件
s = 'dfjhg\nhdgf' # \n 会被解析成换行符
f.write(s)
f.close()
文件内容:
dfjhg
hdgf
f = open('newfile.txt', 'w')
L = ['sadf', 'sdf\n', '324\n'] # \n 被解析
f.writelines(L)
f.close()
文件内容:
sadfsdf
324
我们输一个不是字符串类型的试试:
L = ['sadf', 'sdf\n', '324\n', True] # 把上述列表改成这个
结果出现错误:
Traceback (most recent call last):
File "/home/.../file_write_text.py", line 3, in <module>
f.writelines(L)
TypeError: write() argument must be str, not bool
错误提示大概是这样的:写的内容必须是字符串类型,而不是布尔类型
f = open('newfile.txt', 'wb') # 使用 wb
L = [b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x81\naaa\n'] # \n 被解析
f.writelines(L)
f.close()
文件内容:
你好!
aaa
也可以使用write写。
有时候写着写着文件突然断电等,让写操作断开了,这时没有写完的就会放入缓冲区里,可以使用flush强制写入文件,具体写法如下:
f.write()
f.flush() # 直接在写后边加这一句话即可
try:
f = open('mynote.txt', 'rt')
b = f.read(3)
print(b)
print('当前的位置是:', f.tell())
f.close()
except OSError:
print('打开二进制文件失败')
打印结果:
bbb
当前的位置是: 3
语法格式:f.seek(偏移量,whence=相对位置) 偏移量:大于0代表向文件尾方向移动,小于0代表向文件头移动 相对位置: 0—–>代表从文件头开始偏移 1—–>代表从文件当前位置开始偏移 2—–>代表从文件尾开始偏移
如有myfile.txt,内容是:abcdeABCDE1234567890
f = open('myfile.txt', 'rb')
b = f.read(3) # 读取 3 个字符
print(b)
f.seek(5, 0) # 0 从文件头开始移动,5 表示向尾移动,偏移量大小为 5,即开始从‘A’读
c = f.read(5) # 读 5 个字符
print(c)
f.seek(2, 1) # 1 表示从当前位置移动,2 表示向尾移动,偏移量大小为 2 ,即从 ‘3’ 开始读
d = f.read(5) # 向尾读取 5 个字符
print(d)
f.seek(-15, 2) # 2 表示从尾开始移动,-15 表示向文件头移动,偏移量大小为 15,即从'A'开始读
e = f.read(5)
print(e)
f.close()
执行结果:
b'abc'
b'ABCDE'
b'34567'
b'ABCDE'
本节完