1. 从文件中读取数据
读取文件的两种方式:
一次性读取文件的全部内容。
每次一行的方式逐步读取。
1.1 读取整个文件
- 想要读取文件,第一步是打开文件,才能访问它。
open() 接受一个参数:打开文件的名称with open('test1') as file_object: contents = file_object.read() print(contents)
python在当前执行的文件所在的目录中查找指定的文件。
函数open()返回一个表示文件的对象,python将该对象赋给file_object 供以后使用。
关键字with在不再需要访问文件后将其关闭。
为什么不调用close()。
- 如果程序存在BUG,导致方法close()未执行,文件将不会关闭。未妥善关闭文件可能导致数据丢失或受损。
- 如果在程序中过早的调用close(),会发现需要使用文件的时候它已关闭(无法访问),这会导致更多的错误。
所以并非在任何情况下都能轻松确定关闭文件的恰当时机,但是通过前面使用的结构就可以让python去确定:你只管打开文件,并在需要的时候使用它,python自会在合适的时候自动将其关闭。
有了表示test1 的文件对象后,使用方法read() 读取这个文件的全部内容,并将其作为一个长长的字符串赋值给变量contents。这样通过打印contents的值,就可以将这个文本文件的全部内容显示出来。
删除字符串末尾的空白:在函数调用print()中使用rstrip();
1.2 文件路径
file_path = 'D:/Desktop/test1.txt'
显示文件路径时,windows系统使用反斜杠(\),而不是斜杠(/),在代码中依然可以使用斜杠。
通过使用绝对路径,可读取系统中任何地方的文件,目前来说最简单的做法是:
- 将数据文件存储在程序文件的所在目录
- 存储在程序文件所在目录下的一个文件夹中。
如果在文件路径中直接使用反斜杠,将引发错误,因为反斜杠用于对字符串中的字符进行转义。
1.3 逐行读取
要以每次一行的方式检查文件,可对文件对象使用for循环。
file_path = 'D:/desktop/test1.txt'
with open(file_path) as file_object:
for line in file_object:
print(line)
// print(line.rstrip())
消除多余的空白行,可在函数调用print()中使用rstrip()
1.4 创建一个包含文件各行内容的列表
使用with关键字时,open()返回的文件对象只在with代码块内可用,如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表:可立即处理文件的各个部分,也可以推迟到程序后面再处理。
file_path = 'D:/desktop/test1.txt'
with open(file_path) as file_object:
lines = file_object.readlines() //从文件中读取每一行,并将其存储在一个列表中,列表被赋值给lines
for line in lines: //使用for循环打印lines中的各行,因为lines的每个元素都对应于文件中的一行,所以输出与文件内容完全一致
print(line.rstrip())
1.5 使用文件的内容
创建一个字符串,它包含文件中存储的所有数字,且没有任何空格:
file_string = ''
for line in lines: //这里的lines是1.4中的lines
file_string+=line.rstrip()
print(file_string)
print(len(file_string))
读取文本文件时,python将其中的所有文本都解读为字符串。如果读取的是数,并要将其作为数值使用,就必须使用函数int()将其转换为整数或使用函数float()将其转换为浮点数。
只想打印小数点后50位时:
print(f"{file_string[:52]}...")
替换:
message.replace('dog','cat')
2. 写入文件
通过将输出写入文件,及时关闭包含程序输出的终端窗口,这些输出也依然存在:
- 在程序结束运行后查看数据
- 分享输出文件
- 编写程序将输出读取到内存中并进行处理
2.1 写入空文件
要将文本写入文件,首先要打开一个文件
filename = 'D:/desktop/test1.txt'
with open(filename,'w') as file_object: //open()提供了两个实参,第一个是要打开文件的名称,第二个实参是('W'),表示写入模式。
file_object.write("hehehe")
writ() 不会在写入的文本末尾添加换行符,要想让字符串都单独占一行,需要在方法调用write()中包含换行符。
file_object.write("hahahah\n")
‘w’ 写入模式
‘r’ 读取模式
’a’ 附加模式 :以附加模式打开文件时,python不会再返回文件对象前清空文件的内容,而是将写入内容添加到文件末尾,如果指定文件不存在,python将会创建一个空文件。
with open(filename,'a') as file_object: file_object.write("xixixi")
‘r+’ 读写模式
如果省略了模式实参,python将以默认的只读模式打开文件
如果要写入的文件不存在,函数open()将自动创建它,然而,以写入模式打开文件时,如果指定文件存在,python将在返回文件对象前清空该文件的内容
python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
练习:提示用户输入名字,用户做出响应后,将名字写入指定文件中。
filename1='name.txt' //如果文件不存在,系统会自动创建
inname = input("please input your name:")
with open(filename1,'a') as file_object:
file_object.write(inname)
3. 异常
try:
print(5/0)
except ZeroDivisionError: //try代码块异常将会执行此代码块
print("you can't divide by zero")
//python 中有pass 语句,用于让python在代码块中什么都不要做
else: //依赖try代码块成功执行的代码都放在else里面
...