Python文件读写

1 打开文件

打开文件open(),对于文件来说,Python解释器想要打开磁盘上的文件,需要通过调用操作系统让操作系统把文件读入内存

1
2
3
4
5
6
f = open("d:/123",encoding="utf-8") # 需要用字符串
# 路径是绝对路径
# 设置解码的方式是utf-8
data= f.read()
print(data)
f.close()

win操作系统默认的额是gbk,encoding=”utf-8”,指定操作系统的编码和解码方式

2 操作文件

2.1 字符操作 r w a

可读

f.read()
是读全部的内容

f.read(n)
例如f.read(3) 读取的是前3个字符(Python3),在系统打开文件的时候,指针(光标默认是在0的位置)

当读取完全部的内容后,光标位置就到了最后的位置
例如文件内容是:hello哈哈1234564789

1
2
3
4
5
6
7
8
f = open("test",encoding="utf-8") # 需要用字符串
# 路径是绝对路径
# 设置解码的方式是utf-8
data= f.read(5) # 读取到第5个字符
print(data)
data2= f.read() # 这里就是从光标的位置开始读
print(data2)
f.close()

输出结果是:
hello
哈哈1234564789

需要注意的是Python2读取的是字节

f.readline() 读每一行的内容

1
2
3
4
5
6
7
8
f = open("test",encoding="utf-8") # 需要用字符串
# 路径是绝对路径
# 设置解码的方式是utf-8
data = f.readline().strip() #
print(data)
data2 = f.readline()
print(data2)
f.close()

结果是:
hello哈哈1234564789
123132

f.readlines() 读所有的行,返回值是列表(列表可以迭代)

1
2
data = f.readlines()
print(data)

结果是:
[‘hello哈哈1234564789\n’, ‘123132\n’, ‘4567\n’, ‘789\n’]

迭代显示多有的行:

1
2
3
for line in f.readlines(): # 这里迭代的是一个列表
print(line.strip()) # 这里是去除所有的换行符
# data = f.readlines()

结果是:
hello哈哈1234564789
123132
4567
789
但是这里有一个缺点,是在文件很大的时候,这个列表的所有的内容都会被读入内存中。文件很大的情况就造成内存占用过高。

这里有一种解决方案:

使用句柄(handle ):

一般说来,你可以把句柄想象成一个对文本信息的“封装”。

资料链接:http://biopython-cn.readthedocs.io/zh_CN/latest/cn/chr22.html

相比普通文本信息,使用句柄至少有两个好处:

对于以不同方式存储的信息,句柄提供了一个标准的处理方法。这些文本信息可能来自文件、内存中的一个字符串、命令行指令的输出或者来自于远程网站信息,但是句柄提供了一种通用的方式处理这些不同格式和来源的文本信息。
句柄可以依次读取文本信息,而不是一次读取所有信息。这点在处理超大文件时尤为有用,因为一次载入一个大文件可能会占去你所有的内存。

每次只执行一行,执行完的行会被Python内存回收

1
2
3
f = open("test",encoding="utf-8")
for line in f: #这里的f 是一个句柄,句柄也是一个可迭代的对象
print(line.strip()) #

结果是:
hello哈哈1234564789
123132
4567
789

练习,在诗文中的第三行添加李白添加内容

1
2
3
4
5
6
7
count = 0
for line in f: # 调用的是句柄的对象
if count == 3 :
line = "".join([line.strip(),'李白']) # 字符串的拼接 在第三行的时候就把换行符删除
print(line.strip()) # 把文本中所有的换行符删除
count += 1
f.close()

可写

对文件读写前需要设置文件的句柄为读w,
f=open(“test3”,mode=”w”,encoding=”utf8”)

写文件在打开的时候进行句柄操作,文件一打开的时候就清空,但是中间的wirte在写的过程中,只要文件没有关闭,不会覆盖。

1
2
3
f=open("test",mode="w",encoding="utf8")
f.write("中文") # 此时是清空原来的文件后,用“中文”覆盖
f.close()
1
2
3
4
f=open("test",mode="w",encoding="utf8")
f.write("中文\n")
f.write("123") # 此时在文件没有关闭前,写入的都是追加的方式
f.close()

结果是:
中文
123

可读可写

2.2 字节操作 rb wb ab

3 关闭文件

Python打印进度条

1
2
3
4
5
6
7
8
9
10
11
12
import sys
import time
count = 0
for i in range(101): #range的范围是左开右闭 0-100
sys.stdout.write("\r%s%%%s"%(i,"#"*i)) # 字符(#)的拼接,使用乘法 %% 是百分号的转义
# \r是将光标放到行首
# sys.stdout.write("#")
sys.stdout.flush() #马上写入磁盘
time.sleep(0.5) # 延时0.5s
count += 1

结果:
100%####################################################################################################

© 2018 Peter's Blog Center All Rights Reserved.
Theme by hiero