简述
要使用文本中的信息首先要将文本中的信息读取到内存中。
可以一次性读取文本的全部内容,也可以逐行读取。
不管以何种方式使用文件,必须首先打开文件。
open()
open()函数一般和with关键字搭配使用:
- 关键字with在不需要使用文件后将其关闭,无需再写close()#尽管同样可以使用open(),close()打开关闭文件
- 如果不使用with,当程序打开文件后的后续操作中存在bug,导致close()语句未执行,文件将不会关闭,可能会引起数据丢失
- 如果不使用with,当程序过早的close()关闭文件,将会在使用问件时过早的关闭,将会导致更的错误,所以认为不能很好的确认恰当的时机关闭文件。
- with可以让python去确定什么适当的时机关闭文件,你只需要打开文件并使用就行了。
- 使用关键字时,open()返回的文件对象只在with代码块内可用。(如果想在with代码块外使用,可在with代码块内将想要使用的内容赋值给给一个变量)
全文一次性读取read()
读取文件中的所有内容,返回一个字符串对象,如果文件特别的话不建议这样做(读取的内容都刚在内存中,很占用内存空间)
digist.txt
1234567890 23456789 3456789A
testdata.py
#open函数返回一个表示文件的对象 with open(r‘digist.txt‘) as f: #python在当前执行的文件(testdata.py)目录中( # learnother)查找指定的文件digist.txt contents = f.read() print(contents)
print(‘-----------‘)
#输出结果
1234567890
23456789
3456789A
-----------
输出
*这里多出空行(----------和A所在行之后多出来一个空行)的原因:read()到达文件末尾时返回一个空字符串,而这个空字符串现实出来就是一个空行
要删除这个空行可以使用rstrip()删除字符串末尾的空白。现在的输出和digist.txt原文保持一致
with open(r‘digist.txt‘) as f: #python在当前执行的文件(testdata.py)目录中( # learnother)查找指定的文件digist.txt contents = f.read() print(contents.rstrip()) print(‘-----------‘) #输出结果 1234567890 23456789 3456789A -----------
逐行读取
filename = r"digist.txt" with open(filename) as f: for line in f: print(line) """这里使用了filename变量,告诉python去哪里找对应的文件打开,因此可以根据文件路径轻松的键digist.txt替换成你想要打开的任意文件(完整的文件路径)""" print("----------") #输出 1234567890 23456789 3456789A ----------
为什么会出现这些空白行?
因为在这个文件中,每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符。一个来来自文件,一个来自print语句。
消除多余的空白:rstrip()
filename = r"digist.txt" with open(filename) as f: for line in f: print(line.rstrip()) print("----------") #输出 1234567890 23456789 3456789A ----------
readline()
filename = r"digist.txt" with open(filename) as f: lines = f.readlines() data1 = ‘‘ for line in lines: data1 += line.rstrip() print(data1)#1234567890 23456789 3456789A data2 = ‘‘ for line in lines: data2 += line.strip()#1234567890234567893456789A print(data2)
在读取文本文件时,Python将其中所有的文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,或者使用函数float()将其转换为浮点数。
写入文件
Puthon只能将字符串写入文本文件中,要将数值数据存入文本文件中,必须用函数str()将其转化为字符串格式。
以写入(‘w’)模式打开文件,如果指定的文件已经存在,Python将在返回文件对象前清空该文件。如果文件不存在,函数open()将自动创建它。
模式 | 操作类型 | 操作文件不存在 | 文件是否会被覆盖 |
r | 只读 | error | - |
r+ | 读写 | error | T |
w | 只写 | create | |
w+ | 读写 | create | |
a | 只追加写 | create | F,追加 |
a+ | 追加读写 | create | F,追加 |
wb | 只写,二进制字符串 | create | T |
rb | 只读二进制字符串 | error | _ |
write()函数不会在你写入的文本末尾添加换行符,因此写入多行没有自定换行符,文件将会和预期结果不一致。
filename = r"programming.txt" with open(filename, ‘w‘) as file_object: file_object.write("I love Python.") file_object.write("I love Python coding.") #文件内容:I love Python.I love Python coding.
要想能够换行需要再每次的写入中加上换行符“\n”不再演示。
文件异常处理
尝试读取一个不存在的文件。
filename = r"traval.txt" with open(filename, ‘r‘) as file_object: file_object.write("I love Python.") file_object.write("I love Python coding.") """ with open(filename, ‘r‘) as file_object: FileNotFoundError: [Errno 2] No such file or directory: ‘traval.txt‘ """
处理异常:
def count_words: try: with open(filename, ‘r‘) as f_ob: contents = f_ob.read() except FileNotFoundError: msg = "Sorry, the file" + filename + "does not exist" print(msg) else: #计算文件中含有的单词数 words = contents.split() num_words = len(words) print("The file" + filename + "has about" + str(num_words) + "words.") file_names = [‘file1‘, ‘file2,...] for filename in file_names: count_words(filename)
加入文件filen不存在丝毫不会影响其他存在文件的处理。
存储数据
未完待补充。。。。。。