第九章 文件

9.1 从文件中读取数据

9.1.1 读取整个文件

pi.txt

3.14159
  26535
  89793
with open('pi.txt','r') as file_object:
    contents = file_object.read()
    print(contents)

输出:

3.14159
  26535
  89793
  
  • with open()可以不需要在访问文件后关闭,随着with的结束,文件会自动关闭
  • open()将目标文件打开,当做一个对象。
  • read()将文件中所有内容读取为一个长长的字符串
  • 输出的文本最后有空行是因为read()达到文件尾时会返回一个空字符串。消除空行可用rstrip()

### 9.1.2 逐行读取

with open('pi.txt','r') as file_object:
    for line in file_object:
        print(line)

输出:

3.14159

  26535
  
  89793
  

每行之间都有一个空行,是因为文本文件每行结尾都有一个换行符,而print()每次都会自动换行,所以多了一个换行。
print(line)改为print(line.rstrip())即可解决

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

with open('pi.txt','r') as file_object:
    lines = file_object.readlines()
    
for line in lines:
    print(line.strip())

readlines()读取文本中的每一行,并存储在一个列表里。
调用len()可以获知文件内容的行数。
这样可以让在with open结束后依然可以使用文本内容。

9.1.4 replace()替换字符串的内容

s = 'I Love C++'
s.replace('C++','Python')
print(s)

I Love Python

9.2 写入文件

9.2.1 写入空文件

with open('filename', 'w') as fo:
    fo.write('I love you')

打开文件,会发现文件内容为:

I love you

9.2.2 写入多行

with open('filename', 'w') as fo:
    fo.write('I love you')
    fo.write('I love you too')

打开文件,会发现文件内容为:

I love youI love you too

write()不会像print()一样自动换行,所以要自己添加换行符

with open('filename', 'w') as fo:
    fo.write('I love you\n')
    fo.write('I love you too')

9.2.3 在文件后附加内容

就是打开模式改为'a'

9.3 异常

9.3.1 ZeroDivisionError异常

如果程序中出现除以0的情况,程序将会反馈Traceback错误信息:ZeroDivisionError

9.3.2 try-except 代码块

当你认为可能发生错误时,可编写一个try-except代码块来处理可能引发的异常。

try:
    print(5/0)
except:
    print("You can't divide by zero")
  • try代码块出现异常时,Python将跳过try代码块而去执行except代码块。

9.3.3 else 代码块

num1 = 5
num2 = int(input())
answer = num1/num2
try:
    print(5/0)
except:
    print("You can't divide by zero")
else:
    print(answer)

-当try代码块执行成功时,将会接着执行else代码块

9.3.4 FileNotFoundError异常

文件打开失败时会返回改错误

9.3.5 split()处理字符串

split()函数将字符串根据空格分隔,并创建一个 单词列表

s = 'I love you'
words = s.split()
print(words)

['I', 'love', 'you']

调用len()函数即可以获知字符串单词个数。

9.3.6 处理多个文件

有一种方法是将一系列文件名存在列表里:

files = ['f1.txt', 'f2.txt', 'f3.txt']
for filename in files:
    with open(filename):
        ...

9.3.7 使用pass语句跳过异常语句

try:
    print(5/0)
except:
    pass

pass语句会让Python什么都不做,“一声不吭”。