一, 文件操作
  • 基本语法:
#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)