Python读取文件

一、读取整个文件

       读写文件是最常用的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函数。

 

文章未经博主同意,禁止转载!

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值