目录
一、读取整个文件
读取文件主要用到两个方式,即:
1. with方式
with open('文件名') as file_object:
contents = file_object.read()
#表示逐行读取
for line in file_object:
print (line)
2. open方式
open方法直接打开并读取文件,不使用with语句,此方法直接读取文件,但是要记得关闭文件,我们要知道,我们操作的是什么,目的是什么,如果我们只是单纯的读取文件的内容,而不去修改它,那么就单纯使用open()方法,不用第二参数即可。函数open()接受一个参数:要打开文件的名称。
f = open('poem.txt')
# 读取整个文件
contents = f.read()
print(contents)
#组行读取
for line in f:
print(line.strip())
# 读取文件内容到一个列表中
lines = file_object.readlines()
print(lines)
f.close()
3. open()函数和with open()的异同点
- with 语句在不再需要访问文件后将其关闭。让python自己判断什么时候该关闭,并自己去关闭。
- 直接使用open()方法打开文件,要自己调用close()方法关闭文件。如果程序存在bug,导致close()语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。如果在程序中过早地调用close(),我们会发现需要使用文件时它已关闭(无法访问),这会导致更多的错误。并非任何情况下都能轻松地确定关闭文件的恰当时机。
- open()后是一个对象,这个对象有read()方法与write()方法。
4. 文件路径
在读取文件过程中涉及到文件路径,这里会提到相对路径和绝对路径。
如果被读取的文件在当前执行文件所在的目录中,就可以直接with open(‘文件名’),但是如果不在被执行文件夹下,就要涉及到相对复杂一点的路径读取。
根据文件的组织方式,有时可能要打开不在程序文件所属目录中的文件。例如,可能将程序文件存储在了文件夹Python_work中,而在文件夹Python_work中存在子文件夹text_file,其用于存储程序文件操作的文本文件。尽管文件夹Python_work中包含text_file文件,仅向open()传递位于该文件夹中的文件的名称不可以,源于Python只在文件夹Python_work中查找,而不胡在其子文件夹text_file中查找。这需要提供具体文件路径,应该标出相对路径:
with open('text_files\filename.txt') as file_object:
值得注意的是:在Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/)。
如果相对路径走不通,那就使用绝对路径,如下:
file_path = 'C:\users\ehmidhih\other_files\text_file\filename.txt'
with open(file_path) as file_oject:
5. 读取文件常用的三种方法的区别
常常在读取文件时,会将read(),readline(),readlines()搞混,现对这三个方法做个总结:
#这是一个文本文件,命名为l.txt
if you have a dream
please try to do it
because dream is lovely
- read([size])方法:从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它范围为字符串对象.
#read()方法
f = open("a.txt")
lines = f.read()
print(lines)
print(type(lines))
f.close()
输出结果为:
if you have a dream
please try to do it
because dream is lovely
<class 'str'>
- readline()方法:从字面意思可以看出,该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。
小例子:
f = open('1.txt','r')
result = list()
for line in open('1.txt'):
line = f.readline()
print(line)
result.append(line)
print(result)
f.close()
输出结果:
D:\anaconda\python.exe D:/pyworkspace/11/2018.12.17/lianxi0/0.2.py
if you have a dream
please try to do it
because dream is lovely
['if you have a dream\n', 'please try to do it\n', 'because dream is lovely']
Process finished with exit code 0
- readlines()方法:读取整个文件所有行,保存在一个列表(list)变量中,该列表可以由Python的for in 结果进行处理,每行作为一个元素,但读取大文件会比较占内存。
运行代码:
f = open('1.txt', 'r') #以读方式打开文件
result = list()
for line in f.readlines(): #依次读取每行
line = line.strip() #去掉每行头尾空白
if not len(line) or line.startswith('#'): #判断是否是空行或注释行
continue #是的话,跳过不处理
result.append(line) #保存
result.sort() #排序结果
print(result)
运行结果:
D:\anaconda\python.exe D:/pyworkspace/11/2018.12.17/lianxi0/0.2.py
['because dream is lovely', 'if you have a dream', 'please try to do it']
二、文件的写入
- 写模式w特点:(1)只能写,不能读;(2)写的时候会把原来文件的内容清空;(3)当文件不存在时,会创建新文件。
- 写读模式w+特点:(1)可以写,也可以读;(2)写的时候会把原来文件的内容清空;(3)当文件不存在时,会创建新文件。
- 追加模式a特点:(1)不能读;(2)可以写,是追加写,即在原内容末尾添加新内容;(3)当文件不存在时,创建新文件。
- 追加读a+模式特点:(1)可读可写;(2)写的时候是追加写,即在原内容末尾添加新内容;(3)当文件不存在时,创建新文件。
下面对读写模式进行小结:
r | 只能读 |
r+ | 可读可写,不会创建不存在的文件,从顶部开始写,会覆盖之前此位置的内容 |
w | 只能写,覆盖整个原有文件(不要乱用),不存在则创建 |
w+ | 可读可写,如果文件存在,则覆盖整个文件,不存在则创建 |
a | 只能写,从文件底部添加内容 不存在则创建 |
a+ | 可读可写 从文件顶部读取内容 从文件底部添加内容 不存在则创建 |
简单举个例子:
#W模式
filename = '1.txt'
with open (filename,'w') as file_object :
file_object.write("i love you \n")
file_object.write("thank you \n") # 加上\n可以一行一行的加入
#a模式
filename = '1.txt'
with open (filename,'a') as file_object :
file_object.write(" you are cute \n")
file_object.write("i love you \n") # 加上\n可以一行一行的加入