一, 文件操作
- 基本语法:
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
f.close 如果没有这句话,把文件删除,程序会报错
- 文件编码
#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open('a.txt','r',encoding='utf-8')
- 文件打开模式
#1. 打开文件的模式有(默认为文本模式): r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,只写模式【不可读;不存在则创建;存在则清空内容,带w操作会把之前内容清空,然后写入】 a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】 #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码 #3,‘+’模式(就是增加了一个功能) r+, 读写【可读,可写】 w+,写读【可写,可读】 a+, 写读【可写,可读】 #4,以bytes类型操作的读写,写读,写读模式 r+b, 读写【可读,可写】 w+b,写读【可写,可读】 a+b, 写读【可写,可读】

1 文件操作:如果处理的是非文本文件,使用b模式 2 读: 3 r: 只读 4 f.read() 读取全部内容,但是有弊端,如果文件过大的话,比较占内存,可能会导致内存崩溃 5 f.read(n) 读取n个字符,如果再次读取的话,会从当前位置继续读下去 6 (最常用)f.readline() 一次读一行,每次读取出来的数据都会有⼀ 个\n 所以呢. 需要我们使⽤strip()⽅法来去掉\n或者空格 7 每次print的时候,默认会有一个end= '\n' 8 文件是一个可迭代对象,可以用for循环 9 f = open("../def/哇擦.txt", mode="r", encoding="utf-8") 10 for line in f: 11 print(line.strip()) 12 f.readlines() 一次读取多行,结果是一个列表 13 14 rb:读取byts类型,可以不写encodeing="" 15 16 r+ : 读写,先读后写,读出来的是原来的内容,写入的时候是追加写 17 不论读取了多少内容,不论光标在哪,写入的时候都是在末尾写入 18 如果强行移动光标的话,写也会在末尾写 19 如果要先写后读的话,这时写入的是在开头 20 21 写: 带w的都会把之前的内容清空,然后写 22 如果文件不存在的话,会自动创建文件 23 w:写,只写 24 f.write() 会把之前的内容清除,然后写 25 wb:写入bytes形式,也可以不写encodeing= '' 26 27 w+ : (很少用,因为会清空文件中的内容)先写后读,会把之前的内容清空,然后写入,再读取内容是空的,因为在写入的时候光标已经移动到末尾,所以读不出来 28 29 30 追加: 31 a : 追加写,在原有内容后面追加内容 32 写的时候,换行需要手动控制 33 34 ab: 35 a+: 追加写完后读,读的时候读不出内容,因为光标在最后,要想读的话,先把光标移到最开始
- 文件路径:
绝对路径:从磁盘的根目录寻找,或者从互联网上寻找一个路径
相对路径: 相对于当前程序所在的文件夹,一般写程序用的比较多
../ 从当前文件夹出来,代表上一层文件夹
- 其他相关操作:
光标的问题:
f.seek(n) 移动光标到n位置,注意, 移动的单位是byte. 所以如果是UTF-8的中文部分要 是3的倍数.
括号里面需要给参数,0表示开头,1表示当前位置,2表示末尾
f.seek(0) 光标移动到开头
f.seek(0,1) 当前位置
f.seek(0,2) 光标移动到结尾
多次读取一个文件的话,读取一遍后,把光标移到最开头,然后再使用for循环读取
tell() 可以获取光标当前所在的位置
truncate() 截断⽂件 从文件开头截断到光标位置
默认删掉光标后面的所有内容
如果括号里面给了参数,表示从头截断到参数位置
- 修改文件以及另一种文件的打开方式 文件本身不支持修改,
如果要修改的话,必须按照以下步骤修改
导入os模块,import os
打开目标文件 用r \(表示下一行的内容跟这一行属于同一行)
打开(创建)一个新的文件 用w
for循环读取每一行
替换每一行的指定内容
把每一行写入新创建的文件
os.remove('删除原文件')
os.rename('新文件名','原文件名') # 把新文件名字改为原文件名字
代码示例:
import os with open("⼩小娃娃", mode="r", encoding="utf-8") as f1,\ open("⼩小娃娃_new", mode="w", encoding="UTF-8") as f2: for line in f1: new_line = line.replace("⼤大⽩白梨梨", "冰糖葫芦") f2.write(new_line) os.remove("⼩小娃娃") # 删除源⽂文件 os.rename("⼩小娃娃_new", "⼩小娃娃") # 重命名新⽂文件
------------------------------------------------------------------------
这样就把文件里面想要修改的内容修改成功
- 处理日志文件:
lst = [] with open('2018-08-06.log',mode = 'r',encodeing = 'utf-8') as f: first = f.readline().strip().split(',') for line in f: dic = {} ls = line.strip().split(',') for i in range(len(first)): dic[first[i]] = ls[i] lst.append(dic) print(lst)