一、从文件中读取数据

①一次性读取

②每次一行的方式逐步读取

读取整个文件

在main.py中的代码如下:

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

分析:

1.要使用文件,先要打开文件。用函数open()接收一个参数,为要打开的文件名称,返回一个表示文件的对象。再将这个对象存储在后面使用的变量中

2.关键字with:在不再需要访问文件后将其关闭(推荐使用此方法)。不推荐使用close(),因为不是每个人都能很好把控关闭文件的时机。

3.方法read():读取文件的全部内容,将其作为一个长长的字符串存储在变量contents中。

 在main.py所在的目录下创建文件pi_digits.txt内容为:

3.1415926535
  8979323846
  2643383279

运行后得到结果:

python file读取后没有close python读取文件报错_python

 相比于原文件,输出的末尾多了一个空行。因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在print语句中使用rstrip()删除字符串末尾的空白。

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

结果:

python file读取后没有close python读取文件报错_Python_02

 逐行读取

filename='pi_digits.txt'
with open(filename) as file_object:
    for line in file_object:
        print(line)

 

python file读取后没有close python读取文件报错_代码块_03

 空行更多了,因为在文件的每行后都有一个看不见的换行符,而print语句也会加上一个换行符。消除多余空白行,使用rstrip()

filename='pi_digits.txt'
with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())

python file读取后没有close python读取文件报错_python_04

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

使用关键字with时,open()返回的对象只能在with代码块内使用。如果想要在with代码块外使用该怎么办呢?可在with代码块内将文件的各行存储在一个列表中。

"""将文件各行存储在列表中"""

filename='pi_digits.txt'

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

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

python file读取后没有close python读取文件报错_代码块_05

 方法readlines()从文件中读取每一行,并将其存储在一个列表中。接下来,该列表被存储到变量lines中。列表lines中的每个元素都对应于文件中的一行。

使用文件的内容

"""使用文件的内容"""

filename='pi_digits.txt'

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

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

print(pi_string)
print(len(pi_string))

python file读取后没有close python读取文件报错_Python_06

 创建一个空字符串,使用方法strip()删除空格。

包含一百万位的大型文件

如果文本文件中存储的不是精确到小数点后30位的圆周率值,而是后1 000 000位的圆周率值,也无需对前面的程序做任何修改,只需将前面的文件传给它即可。

对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。

二、写入文件

通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可以编写程序来将这些输出读取到内存中并进行处理。

1.写入空文件

"""写入空文件"""

filename='programming.txt'

with open(filename,'w') as file_object:
    file_object.write("I love programming!")

python file读取后没有close python读取文件报错_git_07

解释:

1.要将文本写入文件,调用open()时要提供另外一个参数。

参数①:也是要打开的文件的名称

参数②:这里为'w',告诉Python要以写入模式打开文件。

打开文件时,还可以指定的模式有:读取模式('r')、附加模式('a')、让我们能够读取和写入文件的模式('r+')

2.如果省略了模式参数,就会以默认的模式(只读模式)打开文件。

3.如果要写入的文件不存在,函数open()将自动创建它。

4.以写入模式('w')打开文件时要小心,如果指定文件已经存在,在返回文件对象前清空该文件。

5.Python只能将字符串写入文本文件。所以在要将数值数据写入文本文件中时,必须先使用函数str()将其转换成字符串格式。


2.写入多行

函数write()不会在写入的文本末尾添加换行符。

"""写入多行"""

filename='programming.txt'

with open(filename,'w') as file_object:
    file_object.write("I love programming.")
    file_object.write("I love creating new games.")

结果:

python file读取后没有close python读取文件报错_Python_08

 需要添加换行符:

"""写入多行"""

filename='programming.txt'

with open(filename,'w') as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love creating new games.\n")

python file读取后没有close python读取文件报错_python_09

还可以使用空格、制表符和空行来设置这些输出的格式。

3.附加到文件

使用附加模式。

添加内容,而不是覆盖原来的内容,不会在返回文件对象前清空文件。

写入到文件的行都将添加到文件末尾。

如果指定的文件不存在,Python将会创建一个空文件。

"""附加到文件"""

filename='programming.txt'

with open(filename,'a') as file_object:
    file_object.write("I also love finding meaning in large datasets.\n")
    file_object.write("I love creating appps.\n")

python file读取后没有close python读取文件报错_git_10

三、异常

每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果编写了处理该异常的代码,程序将继续运行;如果未对异常进行处理,程序将停止,并显示一个traceback,其中包含异常的报告。

异常是使用try-except代码块进行处理的。这个代码块让Python执行指定的操作,同时告诉Python发生异常时该怎么做。使用了try-except代码块后即便出现了异常,程序也将继续运行,显示你编写的友好的错误信息。

"""除以0时"""

print(5/0)

不出意外的出现了错误: 

python file读取后没有close python读取文件报错_python_11

程序停止运行,并在上面的traceback中指出发生了哪种异常,我们可以根据这些信息对程序进行修改。

1.使用try-except代码块 

try:放导致错误的代码行

except:放处理错误的代码。except后会指定错误类型

如果try中的代码没有问题,就会跳过except中的代码;如果出现错误,就会运行except中和引发的错误相同的代码。

上一个的例子中可以知道是发生了ZeroDivisionError异常。处理ZeroDivisionError异常的try-except代码块如下:

"""使用try-except代码块处理ZeroDivisionError异常"""

try:
    print(5 / 0)
except ZeroDivisionError:
    print("You can't divide by zero!")

python file读取后没有close python读取文件报错_代码块_12

 如果try-except后还有其他代码,程序将接着执行。

2.try-except-else代码块

Python尝试执行try中的代码,只有可能引发异常的代码才需要放在try中;

try代码块成功执行后可能需要运行的代码放在else代码块中;

如果在尝试执行try代码块中的代码时引发了异常,执行except中的代码块。

使用异常的重要性:

发生错误时,如果程序还有工作没有完成,妥善地处理错误显得尤为重要。这种情况经常出现在要求用户提供输入的程序中;如果程序能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。

例子:简单计算器

"""简单计算器--未使用try-except-else时"""

print("Give me two numbers,I will divide them.")
print("Enter 'q' to quit.")

while True:
    first_number=input("First number: ")
    if first_number=='q':
        break
    second_number = input("Second number: ")
    if second_number == 'q':
        break
    answer=int(first_number)/int(second_number)
    print(answer)

python file读取后没有close python读取文件报错_python_13

 下面对代码进行更改:

"""简单计算器--未使用try-except-else时"""

print("Give me two numbers,I will divide them.")
print("Enter 'q' to quit.")

while True:
    first_number=input("First number: ")
    if first_number=='q':
        break
    second_number = input("Second number: ")
    if second_number == 'q':
        break
    try:
        answer = int(first_number) / int(second_number)
    except ZeroDivisionError:
        print("You can't divide by 0!")
    else:
        print(answer)

python file读取后没有close python读取文件报错_代码块_14

 

3.

参考:《Python编程从入门到实践》