文件的操作

文件操作的大纲:

读模式:
        *r
            read
            read(n)
            readline()
            readlines()
            for循环 最好的
        rb
        *r+
        r+b

    写模式:
        *w
            w:没有文件,创建文件写内容。
            w:如果有文件,清空原文件,写入新内容。
        wb
        w+
        w+b
    追加模式
        *a
            a:没有文件,创建文件写内容。
            a:如果有文件,最后面追加新内容。
        ab
        a+
        a+b
        补充:
            gbk utf-8
            对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。
            s1 = '123abc*'
            b1 = s1.encode('utf-8')
            s2 = b1.decode('gbk')
            print(s2)
View Code
一,文件操作初识
创建一个文件例:新建一个报表.txt,保存在D盘下。用python代码去写,类似于wap,word的应用程序功能
f1 = open('d:学生家长联系方式.txt', encoding='GB2312', mode='r')
 print(f1.read())
 f1.close()
path   文件路径: d:人员联系方式.txt
encoding编码方式: utf-8 , gbk.....
mode    操作方式:只读,只写,追加,读写,写读...
路径:绝对路径:从根目录开始,一级一级的一直找,找到文件为止,在Pytharm里,打开文件,得到文件句柄并赋值给一个变量。
相对路径:从当前目录开始找到文件。
绝对路径:
f1 = open (' d:人员联系方式.txt' , encoding = 'utf-8' ,mode='r')
print(f1.read())
f1.close    (绝对路径就是在A,B,C,D,E,的盘里面找,不在同一个文件夹里面找)。
View Code
相对路径:
f2 = open('人员联系方式.txt' ,encoding = 'utf-8')
print(f2.read())
f2.close()                  (在同一个文件里面找)
View Code
变量:f1_obj,f1_file,file,file_handle...文件句柄。
open python的内置函数,但是底层调用的Windows系统的open功能,open功能就是操作文件用的。
windows 系统默认的编码方式gbk,linux,macos:utf-8.
流程:
1,打开文件,产生文件句柄。 
 2,对文件句柄进行相应的操作。
  3,关闭文件。
View Code
错误原因分析:
  UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte
         编码错误:文件存储时编码方式与文件打开时的编码方式不一致。
        SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated uXXXX escape
View Code
改正错误 两种:
第一种:加r
f1 = open(r'd:u护士空姐学生少妇联系方式.txt', encoding='GB2312', mode='r')
            print(f1.read())
            f1.close()
View Code

 第二种:加
  f1 = open('d:\护士空姐学生少妇联系方式.txt', encoding='GB2312', mode='r')
            print(f1.read())
View Code
读模式
***  r:只读,可以默认不写   
r ,rb 模式:
r模式,read(n) 是按照字符读取。
rb模式。read(n) 是按字节读取。
f.read()全部读出来
f1 = open ('E:人员联系方式'.txt,mode='rb')
print(f1.read())
f1.close()
##b'xefxbbxbfxe5xa5xbdxe7x9ax84xe5xa5xbdxe7x9ax84xe5xa5xbdxe7x9ax84xe8xb0
View Code
 f.read(n)
f1 = open('护士学生空姐班主任.txt', encoding='utf-8')
print(f1.read(3))
f1.close()
View Code
bytes类型只操作非文字文件
f1.readline()  按行读取.
f1 = open('E:人员联系方式‘txt',encoding='utf-8')
print(f1.readline())
print(f1.readline())
print(f1.readline())
print(f1.readline())
View Code
readlines( )返回一个list,里面的元素是每一行。
f1 = open('E:人员联系方式‘txt',encoding='utf-8')
print(f1.readlines())
f1.close
View Code
for 循环去读去。
f1 = open('E:人员联系方式‘txt',encoding='utf-8')
for line in f1:
        printd(line)
f1.close()          #打印出来的是写入的文字
View Code
rb 模式 非文字类文件
f1 = open('护士学生空姐班主任.txt',mode='rb')
print(f1.read(1))
f1.close() 
View Code
凡是带b不用encoding
 只有是r模式 mode='r'可以省略不写
rb bytes类型读取。
带b的都是非文本文件 , rb模式  非文字类文件
***r+:读写,先读后写
f1 = open('E:人员联系方式.txt',encoding='utf-8',mode='r+')
print(f1.read())
f1.write('666')
f1.close( )   #  打印出写的文字
View Code
r+b:读写,先读后写
f1 = open('E:人员联系方式.txt',mode='r+b')
print(f1.read())
f1.write('666'.encode('utf-8'))
f1.close( )     #b'xefxbbxbfxe5xa5xbdxe7x9ax84xe5xa5xbdxe7x9a
View Code
写模式:
w,wb 模式
w:写:没有文件,创建文件写内容。如果有文件,清空原文件,写入新内容。
f1 = open('log1',encoding='utf-8',mode='w')
f1.write('老男孩是最好的培训学校。。')
f1.close
f1 = open('log1',encoding='utf-8',mode='w')
f1.write('老男孩’)
f1.close()
View Code
wb 模式
f1 = open('log2', mode='wb')
f1.write('法国进口分类结果'.encode('utf-8'))
f1.close()
View Code
rb与wb的区别
f1 = open('log2',mode='wb')
f1.write('老男孩'.encode('utf-8'))
f1.close()
View Code
w+:先写后读
f1 = open('log1',encoding='utf-8',mode='w+')
f1.write('老男孩...')
f1.seek(0)    #调整光标
print(f1.read( ))
f1.close()      #老男孩...
View Code
追加模式
w + b
a   ab
   补充:对于英文字母数字特殊字符,utf-8与gbk可以互相识别。
但非字母就不可以。
f1 = open('log1',encoding='utf-8',mode='a')
f1.write('barry')
f1.close()
View Code
a:没有文件创建文件写内容。
a+:有文件,直接在元文件的后面住家新内容。
f1 = open('log3',encoding='utf-8',mode='a')
f1.write('barry')
f1.close()
f1 = open('log3',mode='ab')
f1.write('中国'.encode('gbk'))
f1.close()        #(打印增加乱码,把'gbk'换成'utf-8'出现中国
View Code
a+ 追加可读
f1 = open('log3', encoding='utf-8', mode='a+')
f1.write('范德萨急功近利开发工具')
f1.seek(0)
print(f1.read())        #中国范德萨急功近利开发工具
f1.close()
View Code
ps  非文字的文件的读取写入
f1 = open('11.jpg',mode='rb')
content = f1.read()
print(content)
f2 = open('小猪配奇'.jpg',mode='wb')
f2.write(content)
View Code
常用方法:
readlable() 判断是否可读
writeable()判断是否可写
f1 = open('log1', encoding='utf-8')
print(f1.readable())
print(f1.writable())
f1 = open('log1', encoding='utf-8',mode='r+')
print(f1.readable())
print(f1.writable())
read   wtite   read(n)   readline()  readlines()  seek
f1 = open('log1',encoding='utf-8')
print(f1.readable())              #True
print(f1.writable())                False
View Code
seek:按照字节去调整光标
seek(0)从开始调节
seek(0,2)将光标调整到最后
f1 = open('log1',encoding='utf-8')
f1.seek(3)
print(f1.read())
f1.close()
View Code
tell也是按字节读告诉光标位置
1 = open('log1', encoding='utf-8')
print(f1.tell())
print(f1.read())
print(f1.tell())
f1.close()
View Code
struncate    (a,a+模式下)对原文件进行截取内容,以字节形式,只能在a模式下使用。
f1 = open('log1',encoding='utf-8',mode='w')
f1.truncate(3)
f1.close()
View Code
gbk,utf-8
对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。
s1 = '123abc*'
b1 = s1.encode('utf-8')
s2 = b1.decode('gbk')
print(s2)                  #123abc*
View Code
文件对的另一种写法:
with open() as 不用主动关闭 f1.close()
同一open 可以操作多个文件
with open('log1', encoding='utf-8') as f1:
    print(f1.read())
with open('log1', encoding='utf-8') as f1,
    open('log2',encoding='utf-8', mode='w') as f2:
    print(f1.read())
    f2.write('666')
with open('log1', encoding='utf-8') as f1:
    content = f1.read()
    f1.close()
    pass
    with open('log1', encoding='utf-8',mode='w') as f2:
        f2.write('333')
View Code
文件的改:
1,打开原文件 old_file,将原内容读取到内存。
2,创建一个新文件new_file。
3,将原内容通过你改写形成新内容,写入到新文件。
4,将原文件删除。
5,将新文件重命名成原文件。
方法一,原文件内容不打,可以用此方法,但是此方法还是很low。
import os
with open('change', encoding='utf-8') as f1,
    open('change.bak', encoding='utf-8', mode='w') as f2:
    old_content = f1.read()
    new_content = old_content.replace('alex', 'SB')
    f2.write(new_content)
os.remove('change')
os.rename('change.bak', 'change')
View Code
方法2
import os
with open('change', encoding='utf-8') as f1,
    open('change.bak', encoding='utf-8', mode='w') as f2:
    for line in f1:
        new_line = line.replace('SB', 'alex')
        f2.write(new_line)
os.remove('change')
os.rename('change.bak', 'change')
View Code

 练习题:

1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。
goods_info = []
with open("a.txt",encoding="utf-8") as f:
    for line in f:
        line = line.strip().split()
        dic = {"name": line[0],"price": line[1],"amount": line[2]}
        goods_info.append(dic)
print(goods_info)



goods_info = []
list_name = ["name", "price", "amount", 'time']
with open("a.txt",encoding="utf-8") as f:
    for line in f:
        line = line.strip().split()
        # ['apple', '10', '3', '2016']
        dic = {}
        for i in range(len(line)):
            dic[list_name[i]] = line[i] # dic['name'] = 'apple' dic['price'] = '10'
        goods_info.append(dic)
print(goods_info)
sum = 0
for i in goods_info:
    money = int(i['price']) * int(i['amount'])
    sum += money
print(sum)
View Code
2,有如下文件:
-------
alex是老男孩python发起人,创建人。
alex其实是人妖。
谁说alex是sb?
你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
----------
将文件中所有的alex都替换成大写的SB。
2,有如下文件:
-------
alex是老男孩python发起人,创建人。
alex其实是人妖。
谁说alex是sb?
你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
----------
将文件中所有的alex都替换成大写的SB。
View Code

3.文件a1.txt内容
文件内容:
name:apple price:10 amount:3 year:2012
name:tesla price:100000 amount:1 year:2013

通过代码,将其构建成这种数据类型:
[{'name':'apple','price':10,'amount':3},
{'name':'tesla','price':1000000,'amount':1}......]
并计算出总价钱。
str = """name:apple price:10 amount:3 year:2012
name:tesla price:100000 amount:1 year:2013
with open(r'a1.txt','w',encoding='utf-8') as write_f:
    write_f.write(str)

person_list = []
sum = 0

with open(r'a1.txt','r',encoding='utf-8') as read_f:
    for lines in read_f:
        line_list = lines.strip().split()
        dic = {}
        for line in line_list:
            line = line.strip().split(":")
            dic[line[0]] = line[1]
        dic.pop('year')
        person_list.append(dic)

for line in person_list:
    sum += (int(line['price']) * int(line['amount']))
print(sum)
View Code
4,文件a2.txt
文件内容:
序号     部门      人数      平均年龄      备注
1       python    30         26         单身狗
2       Linux     26         30         没对象
3       运营部     20         24         女生多
通过代码,将其构建成这种数据类型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
......]
并计算出总价钱。

 序号     部门      人数      平均年龄      备注
1       python    30         26         单身狗
2       Linux     26         30         没对象
3       运营部     20         24         女生多
通过代码,将其构建成这种数据类型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
......]
并计算出总价钱。
f = open('a2', encoding='utf-8')    # 以读的方式打开一个文件,获得一个文件句柄
f1 = f.readline()  # 用文件句柄把第一行文件读取出来,将内容赋值给f1
f1 = f1.strip().split()  # 对第一行文件内容以空格进行分割,形成一个列表赋值给f1
li = []   # 建立一个空列表li
for i in f:   # 循环读取文件剩下的每一行内容,将内容赋值给i
    i1 = i.strip().split()  # 对读取出来的每一行内容去除首尾空格换行符等,
    # 然后以空格进行分割,形成一个列表赋值给i1
    dic = {}    # 建立一个空字典dic
    for j in range(len(i1)):  # 循环i1列表的索引值
        dic[f1[j]] = i1[j]   # 给dic添加键值对,f1通过索引找到内容作为dic的键,
        # i1通过索引找到内容作为值,将键值对添加到dic中
    li.append(dic)  # 将dic添加到li这个列表里面
print(li)  # 打印li
f.close()  # 关闭文件
View Code
 

原文地址:https://www.cnblogs.com/ls13691357174/p/9096330.html