#文件和异常
###读取整个文件
首先在同一文件夹下准备两个文件,这里举例为pi_digits.txt文件和file_reader.py。在pi_dighits文件中存储着圆周率值,是我们将要打开的文件。另一个文件时存储打开文件程序的文件.
pi_digits.txt:
```txt
3.1415926535
8979323846
2643383279
```
file_reader.py:
```python
with open('pi_digits.txt') as file_object:
contents = file_objects.read()
print(contents)
```
函数**open()** 接受一个参数,要打开的文件名称。python将在当前执行的文件(file_reader.py)所在的目录中查找pi_digits.txt,函数open()会返回一个表示文件的对象,这里python将该对象赋给file_object。
关键字**with**在不需要访问文件后将文件关闭,这里我们为了让程序正常执行先不使用close()函数,python会自动关闭文件。
有了表示pi_digits.txt的对象后,使用**read()**方法读取文件的全部内容,并将内容作为字符串传递给变量contents。
但是,在使用read()方法后,输出文件内容时,会比原文件多出一空行,这是因为read()到达文件末尾时,返回一个空的字符串,现实出来就是一个空行,解决这个问题可以在print()中使用rstrip()
```python
print(contents.restrip())
```
###文件路径
如果要python打开不与程序文件位于同一个目录下的文件,需要提供文件路径.假如说,当前执行的程序存储在A的文件夹下,在A的文件夹下还有一个B的子文件夹,在B中存储着filename.txt文件,这是需要为python指明文件路径。这样的文件路径我们称之为相对路径。
```python
with open('text_files\filename.txt') as file_object:
```
**绝对路径**:
```python
file_path = '/home/ehmatthes/other_files/text_files/filename.txt'
with open(file_path) as file_object:
```
文件的绝对路径一般相对较长,可以将其先赋给一个变量,在传递给open()函数,使用绝对路径可以访问系统中的任何文件
**注意**:
>Windows系统之使用反斜杠要注意不于转义字符冲突,所以建议将路径中的每个反>>斜杠都进行转义,如“\\” 。
###逐行读取文件内容
```python
filename = 'pi_digits.txt'
with open(filename) as file_objects:
for line in file_objects:
print(line)
```
执行代码后输出内容显示每一行之间有更多的空格,可以在print()中使用rstrip()减少空格。
###创建一个包含文件各行的列表
```python
filename = 'pi_digits.txt'
with open(filename) as file_objects:
lines = file_objects.readlines()
for line in lines:
print(line.rstrip())
```
>readlines()方法将会从文件中读取每一行,并将其存储在一个列表中去。
```python
filename = 'pi_digits.txt'
with open(filename) as file_objects:
lines = file_objects.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))
```
输出结果为:
```python
3.1415926535 8979323846 2643383279
36
```
输出结果中,每行字符串都包含了每行左边的空格,为了删除这些空格,使用strip()
解释:
>strip()可以删除字符串两边的空格,rstrip()可以删除右边的空格,lstrip()可以删除左边的空格
```python
filename = 'pi_digits.txt'
with open(filename) as file_objects:
lines = file_objects.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
```
输出结果为:
```python
3.141592653589793238462643383279
32
```
**注意**:读取文本文件时,python将所有的文本文件都解读为字符串,如果需要数,使用int()转换。
###读取超大文件
如果需要读取的字符串文件过长,可使用切片操作限制读取位数
```python
print(pi_string[:50])
```
###查看生日是否在圆周率中
```python
path = 'pi_million_digits.txt'
with open(path) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
birthday = input("please input your birthday:")
if birthday in pi_string:
print("Yes")
else:
print("No")
```
###写入空文件
```python
path = 'pro.txt'
with open(path, 'w') as file_object:
file_object.write("I love pro")
```
要打开一个文件并且写入内容,而不是将文件内容显示在屏幕上,需要给open()添加一个参数,告诉python我要写入一个文件,如上面的代码,添加了一个参数“w”.
打开文件时,有很多模式可以选择
>'r':读取模式
'w':写入模式
'a':附加模式
'x':独占写入模式
'b':二进制模式(与其他模式结合使用)
't':文本模式(默认值,与其他模式结合使用)
'+':读写模式(与其他模式结合使用)
>
1.'w'模式:写入文件让你能够写入文件,并且在文件不存在时创建文件。**如果文件已经存在,既有内容将被删除(截断(truncate)),从头开始写.**
2.'x'模式:新建一个文件写入,如果文件已经存在,则会引发FileExistsError错误。
3.'rt'模式:这意味着将把文件视为经过编码的Unicode文本,因此将自动执行解码和编码,且默认使用UTF-8编码。
4.'rb'模式:打开非文本的文件,禁用与文本有关的功能。
**下图引用自菜鸟教程**
![这是图片](https://www.runoob.com/wp-content/uploads/2013/11/2112205-861c05b2bdbc9c28.png "关系图")