文件和异常

从文件中读取数据

文本文件可存储的数据量多的难以置信:天气数据、交通数据、社会经济数据、文学作品等

每当需要分析或修改存储在文件中的信息使,读取文件都很有用,对数据分析程序来说尤其如此。

要使用文本文件中的信息,首先需要将信息读取到内存中

读取整个文件

将下面这个数据存在pi_digits.txt 的文件中

3.1415926535
  8979323846
  2643383279
  5028841971
  6939937510

在pi_digists.txt文件目录下创建file_reading.py文件,其内容如下

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
print(contents)

要以任何方式使用文件,哪怕仅仅打印其内容,都得打开这个文件

函数open()接受一个参数,也就是要打开文件的名称,返回一个表示文件的对象

在本例中,python将返回的对象赋予给file_object供给以后使用

关键字在不需要访问该文件时将其关闭。

可以调用open() 和 close() 来打开和关闭文件。

但有时程序出现bug会导致close()未执行,文件未关闭,可能导致文件里的数据丢失和受损

如果过早调用close(),提前关闭文件,可能会出现更多的错误

方法read()读取这个文件的全部内容

调用后输出有多余的空行,可以在调用print()时使用rstrip()

print(contents.rstrip())

 

文件路径

上面的文件是在py文件的当前目录中寻找的,如果当前目录下没有该文件呢?

比如此时pi_digists.txt文件在当前目录的子文件夹txt_file中,仅仅使用open加文件名是远远不够的

所以需要提供文件路径,可提供的文件路径有相对文件路径和绝对文件路径

相对文件路径

with open('txt_file/pi_digits.txt') as file_object:

这行代码让python到当前文件夹的子文件夹txt_file中去查找pi_digists.txt 文件

绝对文件路径

还可以将文件在计算机的准确位置告知python,比如该文件位于D盘中的某某文件夹中,可以采用如下的格式

with open('D:/code/python/pythonProject/txt_file/pi_digits.txt') as file_object:
    contents = file_object.read()
print(contents.rstrip())

如果一定要使用反斜杠的化,要避免出现\t等情况可以对每个反斜杠进行转义

with open('D:\\code\\python\\pythonProject\\txt_file\\pi_digits.txt') as file_object:
    contents = file_object.read()
print(contents.rstrip())

这种情况也是可以运行的

 

逐行读取

可以将文件名称赋予一个变量,这个变量只是一个让python知道去哪里寻找文件的字符串

filename = 'txt_file/pi_digits.txt'

with open(filename) as file_object:
    #  逐行打印
    for line in file_object:
        print(line)

此时空行变多了,因为在这个文件里每行末尾都会有一个看不见的换行符

而print还会加上一个换行符,要消除这些多余的空行可以用rstrip()

filename = 'txt_file/pi_digits.txt'

with open(filename) as file_object:
    #  逐行打印
    for line in file_object:
        print(line.rstrip())

 

创建一个包含文件各行内容的列表

filename = 'pi_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()

print(lines)

for line in lines:
    print(line.rstrip())

 

使用文件的内容

在读取文本时,python将所有文本都解读为字符串,

同样的要读取数字并使用需要用到int()转换为整数或float( )转换为浮点数

filename = 'pi_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()

pi_string = ''

for line in lines:
    pi_string += line.rstrip().strip()

print(pi_string)
print(len(pi_string))

 

包含一百万位数字的大文件(大文件处理)

圆周率后一百万位,使用切片等

filename = 'pi_million_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()

pi_string = ''

for line in lines:
    pi_string += line.rstrip().strip()

print(f"{pi_string[:52]}")
print(len(pi_string))

比如可以使用下列语句查找你的生日是不是在前一百万位中

filename = 'pi_million_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()

pi_string = ''

for line in lines:
    pi_string += line.rstrip().strip()

birthday = input("Enter your birthday, in form mmddyy: \n")
if birthday in pi_string:
    print("appear")
else:
    print("not appear")

 

posted @ 2022-03-26 21:02  我就一水  阅读(98)  评论(0)    收藏  举报