一、读取整个文件
读写文件是最常用的I/O(Input/Output)操作,Python内置了读写文件的函数,用法是与C语言兼容的。在读写文件之前,必须说明的是,在磁盘上面读取文件的功能是由操作系统提供的,现在的操作系统不容许普通的操作程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件),具体流程如下所示。
要读取文件,需要先创建一个文件,它包含精确到小数点后30位的自然常数e,且在小数点后的每10位处换行。
2.7182818284
5904523536
0287471352
要以读文件的方式打开一个文件对象,可以使用Python内置函数中的open函数传入文件名称与标识符。其中,标识符可指定文件打开模式为读取模式(r)、写入模式(w)、附加模式(a)或读取和写入文件的模式(r+)。Python默认以只读模式打开文件。
>>>f = open('e_digits.txt', 'r')
如果读取的文件不存在,或者在当前工作路径下找不到要读取的文件,open函数就会抛出一个IOError错误,并且给出错误码和详细的信息以说明文件不存在。
>>>f = open('not_exist.txt', 'r')
Traceback (most recent call last):
File"file_read.py", line 2, in <module>
f =open('not_exist.txt', 'r')
FileNotFoundError: [Errno 2] No such file ordirectory: 'not_exist.txt'
如果文件存在且程序可以正常打开文件,那么接下来就可以使用read函数一次性读取文件的全部内容,并将文件内容读入内存,然后用print函数将读取的文件内容打印出来。
>>> f = open('e_point.txt', 'r') # 打开e_point.txt文件并定义变量f
>>>txt = f.read() # 阅读文件e_point.txt的内容并赋值变量txt
>>>print(txt) # 输出文件e_point.txt的内容
2.7182818284
5904523536
0287471352
最后调用close函数关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
>>>f .close()
二、使用with语句读取文件
在文件读取的过程中,一旦程序抛出IOError错误,后面的close函数将不会被调用。所以,在程序运行过程中,无论是否出错,都要确保能正常关闭文件,可以使用try…finally…结构实现。
>>>try:
... f =open('e_point.txt', 'r')
... print(f.read())
>>>finally:
... iff:
... f.close()
虽然运行良好,但是每次都这样写实是太麻烦了,所以Python提供了更加优雅简短的语法。使用with语句可以很好地处理上下文环境产生的异常,会自动调用close函数。
>>>with open('e_point.txt', 'r') as f:
... print(f.read())
这种with语句的使用效果与上文的try…finally…结构的使用效果是一样的,但代码更为简洁,且不必调用close函数。
三、设置工作路径
有时候需要打开不在程序文件所属目录下的文件,那么在程序里就需要提供文件所在路径,让Python到系统特定位置去查找并读取相应文件内容。假如文件e_point.txt储存在文件夹text_file里面,而正在运行的Python程序储存在文件夹Cha里面。
1.相对文件路径
如果文件夹text_file是文件夹Cha的子文件夹,即文件夹text_file在文件夹Cha里面,那么需要提供相对文件路径让Python到指定位置查找文件,而该位置是相对于当前运行的程序所在的目录而言的,即相对文件路径。
>>>with open('text_file\e_point.txt','r') as f:
... print(f.read())
2.绝对文件路径
如果将文件夹text_file放置到桌面,与文件夹Cha没有关系,那么需要提供完整准确的储存位置(即绝对文件路径)给程序,不需要考虑当前运行程序储存在什么位置。
>>>with open(r'C:\Users\45543\Desktop\ text_file\e_point.txt','r') as f:
... print(f.read())
特别的,在绝对路径前面加了r,这是因为在Window系统下,读取文件可以用反斜杠(\),但是在字符串中反斜杠被当作转义字符来使用,文件路径可能会被转义,所以需要在绝对文件路径前添加字符r,显式声明字符串不用转义。
也可以采用双反斜杠(\\)的方式表示路径,此时不需要声明字符串。
>>>withopen('C:\\Users\\45543\\Desktop\\ text_file\\e_point.txt', 'r') as f:
... print(f.read())
使用Linux路径表示方法是正斜杠(/),该方法也不需要声明字符串,在Linux及Windows操作系统下均可使用。
>>>with open('C:/Users/45543/Desktop/text_file/e_point.txt','r') as f:
... print(f.read())
四、创建含有文件数据的列表
读取文件时,常常需要检查其中的每一行,可能需要在文件中查找特定的信息,或者需要以某种方式修改文件中的文本,此时可以对文件对象使用for循环。
>>>file_name = 'e_point.txt'
>>>with open(file_name, 'r') as f:
... for line_t in f:
... print(line_t)
2.7182818284
5904523536
0287471352
需要读取的文件名称赋值给file_name变量,这是为了方便修改文件名称与路径。此时,程序运行结果出现了很多空白行,空白行出现的原因是e_point.txt文档中每行末尾都有一个看不见的换行符,print函数也给打印出来的数据加上了一个换行符。
如果需要消除换行符,可以使用rstrip函数删除string字符串末尾的指定字符(默认为空格)。与之关联的还有lstrip函数(删除字符前面的指定字符)和strip函数(删除字符串首尾两端的指定字符)。
>>>file_name = 'e_point.txt'
>>>with open(file_name, 'r') as f:
... for line_t in f:
... print(line_t.rstrip())
2.7182818284
5904523536
0287471352
read函数可以读取整个文件的内容,但是读取的内容将存储到一个字符串的变量中。
>>>with open('e_point.txt') as f:
... txts = f.read()
>>>print(type(txt))
<class 'str'>
>>>print(txt)
2.7182818284
5904523536
0287471352
如果需要将读取的文件存储到一个列表里面,可以使用readlines函数。该函数可以实现按行读取整个文件内容,然后将读取的内容存储到一个列表里面。
>>>with open('e_point.txt') as f:
... txts = f.readlines()
>>>print(type(txts))
<class 'list'>
>>>print(txts)
['2.7182818284\n','5904523536\n', '0287471352\n']
为了让readlines函数存储的列表正常打印,可以做以下操作。
>>> with open('e_point.txt') as f:
... txts = f.readlines()
>>>for txt in txts:
... print(txt.strip())
2.7182818284
5904523536
0287471352
此外,Python还提供了readline函数,此函数可以实现每次读取文件的一行,通常也是将读取到的一行内容存储到一个字符串变量中,返回str类型。
>>>with open('e_point.txt') as f:
... txt = f.readline()
>>>print(type(txt))
<class 'str'>
>>>print(txt)
2.7182818284
因为readline函数实现的是逐行读取,所以读取整个文件时,速度会比readlines函数慢,所以仅当没有足够内存读取整个文件时才会使用readline函数。
文章未经博主同意,禁止转载!