python 文件操作 11
一.文件读取操作
1. 读取整个文件
在同级目录,创建一个pi_digits.txt文件和file_reader.py文件。
pi_digits.txt文件中加入内容
file_reader.py文件内容如下:
with open('pi_digits.txt') as file_object: contents=file_object.read() print(contents)
open()函数打开文件,接收一个参数:要打开的文件的名称,当前运行的是file_reader.py,因此python在file_reader.py所在的目录中查找pi_digits.txt。open()函数返回一个表示文件的对象赋值给file_object。
with关键字是指:不需需要访问文件后将其关闭。不推荐调用close来关闭文件,因为如果程序存在bug导致方法导致close()未执行,文件将不会关闭,导致数据丢失或受损。
read()方法读取这个文件的全部内容,并将其作为一个长字符串赋值给变量contents。
2. 文件路径
上面是同级目录读取文件,如果不在同级目录,那么需要指定相对路径或绝对路径。在python程序中,路径使用斜杠( / )
当file_reader.py文件与files文件同级时,运行ile_reader.py,读取代码如下
with open('files/pi_digits.txt') as file_object: contents=file_object.read() print(contents)
3.逐行读取
读取文件时,常需要检查其中的每一行 ,可对文件对象使用for循环
with open('files/pi_digits.txt') as file_object: for line in file_object: print(line)
为什么会出现空白行呢? 因为在这个文件中,每行的末尾都有一个看不见的换行符,而函数调用print()也会加上一个换行符,因此每行末尾都有两个换行符。
可加上rstrip()去掉空白行
with open('files/pi_digits.txt') as file_object: for line in file_object: print(line.rstrip())
4.读取所有内容到变量中,退出with后在做逻辑
with open('files/pi_digits.txt') as file_object: lines=file_object.readlines() for line in lines: print(line.rstrip())
注意:读取文本文件时,Python将其中的所有文本都解读为字符串。如果读取的是数,并要将其作为数值使用,就必须使用函数int()将其转换为整数或使用函数float()将其转换为浮点数。
二.文件写入操作
1.创建文件并写入
filename='files/programming.txt' with open(filename,'w') as file_object: file_object.write('python')
调用open时提供了两个参数,第二个参数 w 是写入模式,如果省略了第二个参数,默认就是只读模式 r。
r 读取模式
w 写入模式 (不存在时,自动创建文件)
a 追加模式(打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。)
r+ 读写模式
注意: 使用 w 写入模式时一定要小心,如果文件已存在,将会清空文件原有内容。
write写入,是不换行的。都挤在第一行。如果要换行,可以加\n
filename='files/programming.txt' with open(filename,'w') as file_object: file_object.write('python\n') file_object.write('asp.net core\n')
2.追加内容到文件
filename='files/programming.txt' with open(filename,'a') as file_object: file_object.write('java\n') file_object.write('php\n')
使用a 追加模式,将内容添加到文件末尾,如果文件不存在,将自动创建一个文件。
三. 删除文件指定的行
当文件不大时,这里的一个方案是:先把原有文件数据写入到集合中, 在集合中删除指定的行后,再写入另一个临时文件,将原有文件删除,再将临时文件重命名为原有文件名,代码哪下:
#删除行并保存 def remove_and_save(self): filename='ebs_crawler/files/abc_brand_generate_url_temp.txt' oldfilename='ebs_crawler/files/abc_brand_generate_url.txt' #原有文件 urls=self.urls #原有文件数据写入到集合中 if len(urls) % 10==0: #当集合总数减少时 with open(filename,'w',encoding='UTF-8-sig') as file_object: for url in urls: file_object.write(url+'\n') os.remove(oldfilename) os.rename(filename,oldfilename) self.logger.info(f"删除并保存共url:{len(urls)}个")