python文件操作(文件常用操作方法,文件的改)

文件操作初识
护士空姐学生少妇联系方式.txt
    python代码
    path       文件路径: D:\ 护士空姐学生少妇联系方式.txt
    enconding  编码方式: utf-8  gbk....
    mode       操作方式: 只读,只写,追加,读写,写读....
    路径:绝对路径:从根目录开始找到文件
          相对路径:从当前目录开始找到文件
    错误原因分析:
        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
        两种:
            第一种:加r
            f1 = open(r'd:\u护士空姐学生少妇联系方式.txt', encoding='GB2312', mode='r')
            print(f1.read())
            f1.close()
            第一种:加\
            f1 = open('d:\\护士空姐学生少妇联系方式.txt', encoding='GB2312', mode='r')
            print(f1.read())
            f1.close()
    凡是带b的不用带encoding
    凡是r 模式,mode='r'可以省略不写

 

gbk utf-8
对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。
s1 = '123abc*'
b1 = s1.encode('utf-8')
s2 = b1.decode('gbk')
print(s2)

# f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8',mode='r')
##d:\护士空姐学生少妇.txt'绝对路径
# print(f1.read())
# f1.close()

# f1 = open('d:\untitled3\day8\大爷来玩啊',encoding='utf-8',mode='r')#绝对路径一定要简单,太长的话容易报错。
# f1.close()

# f2= open('大爷,来玩啊',encoding='utf-8',mode='r')#'大爷,来玩啊,相对路径
# print(f2.read())
# f2.close()

 

'''
变量:f1_obj,f1_file,file,file_handle... 文件句柄。
open  python的内置函数,但是底层调用的是windows的open功能,open 是操作文件用的
windows系统默认的编码方式是gbk,masos,linux用的是 utf-8
流程:1打开文件,产生文件句柄
      2对文件句柄进行相关的操作
      3关闭文件
'''
# r    rb
# r模式:read(n) n 是按照字符读取。
# rb模式:read(n) n 是按照字节读取
#
# 1.f.read() 全部读出来
f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8')
print(f1.read())
f1.close()
# 2.f.read(n)
f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8')
print(f1.read(1)) #r是以字符为单位读取的
f1.close()
f1= open('d:\护士空姐学生少妇.txt',mode='rb')
print(f1.read(3))#rb是以字节为单位读取的
f1.close()
# 3.readline 按行读取
f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8')
print(f1.readline())
print(f1.readline())
print(f1.readline())
print(f1.readline())
f1.close()
# 4.readlines  返回一个list,里面的元素是一行
f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8')
print(f1.readlines())
f1.seek(0)#将光标放到开头,for循环才可以执行
for line in f1.readlines():
print(line)
f1.close()

# for 循环去读
f1=open('d:\护士空姐学生少妇.txt',encoding='utf-8')
for line in f1:
    print(line)
f1.close()
# rb模式 非文字类的文件
f1 = open('护士学生空姐班主任.txt',mode='rb')
print(f1.read(1))
f1.close()

# r+ 读写 先读后写
f1 = open('大爷,来玩啊', encoding='utf-8',mode='r+')
print(f1.read())
f1.write('666')
f1.close()

# w wb 模式
# w:没有文件,创建文件些内容
# w:有文件,清空原来内容,重新写内容
f1 = open('log1', encoding='utf-8',mode='w')
f1.write('heheda')
f1.close()

f1 = open('log1', encoding='utf-8',mode='w')
f1.write('jvkjvalnvaiklvd')
f1.close()

wb
f1 = open('log2', mode='wb')
f1.write('法国进口分类结果'.encode('utf-8'))#必须转化为bytes 类型
f1.close()
w+ 先写后读
# f1 = open('log1', encoding='utf-8', mode='w+')
# f1.write('djcjcn.....')
# f1.seek(0)  # 调整光标才能读出来
# print(f1.read())
# f1.close()
 w+b
a ab
# a:没有文件,创建新文件写内容
# ab:有文件,在文件后面追加内容
f1 = open('log4', encoding='utf-8', mode='a')
f1.write('666')
f1.close()
 a+ 追加可读
# f1 = open('log4', encoding='utf-8', mode='a+')
# f1.write('范德萨急功近利开发工具')
# f1.seek(0)
# print(f1.read())
# f1.close()

# f1 = open('log4', mode='ab')
# f1.write('中国'.encode('gbk'))#pycharm 编码方式是utf-8,会出现乱码的情况。
# f1.close()
# 非文字文件的读取和写入?
f1 = open('d:\pian.jpg', mode='rb')
content=f1.read()
print(content)
f2 = open('d:\pian.jpg', mode='wb')
f2.write(content)
read  write  read(n) readline() readlines() seek

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())
seek: 按照字节去调整光标
f1.seek(0,2)#光标放到末尾
f1.seek(0)#光标放到句首

f1 = open('log1', encoding='utf-8')
f1.seek(6)#调整6个字节
print(f1.read())
f1.close()
tell 告诉光标的位置
f1 = open('log1', encoding='utf-8')
print(f1.tell())#没读之前光标是在0位的
print(f1.read())#将文章全部读取
print(f1.tell())#读取文章后光标到最后了
f1.close()
truncate 对原文件进行截取内容,以字节形式,只能在a模式下使用。
f1 = open('log1', encoding='utf-8', mode='a')
f1.truncate(6)#截取6个字节的内容,其他内容清除
f1.close()
文件操作的另一种写法
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('123456')#w:如果有文件,清空原文件,写入新内容。

with open('log1', encoding='utf-8') as f1:
    content = f1.read()
    print(content)
    f1.close()

    pass
    with open('log1', encoding='utf-8',mode='w') as f2:
        f2.write('333')
'''
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')
 方法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('alex', 'SB')
        f2.write(new_line)
os.remove('change')
os.rename('change.bak', 'change')

tast

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}......] 并计算出总价钱。
list=[]
with open('1',encoding='utf-8') as f1:
    for line in f1:
        new_line=line.strip().split()
        dic={'name':new_line[0],'price':new_line[1],'amount':new_line[2]}#new_line[]本来就是str,不用加引号
        list.append(dic)
print(list)
sum=0
for i in list:
    sum+=int(i['price'])*int(i['amount'])
print(sum)
方法二
list=[]
with open('1',encoding='utf-8') as f1:
   for line in f1:
       line=line.strip().split()
       dic={'name':line[0],'price':line[1],'amount':line[2]}
       list.append(dic)
print(list)
sum=0
for i in list:
    money=int(i['price'])*int(i['amount'])#要弄清楚要算什么。i[1]和i[2]对应的是字典,没办法相乘。
    sum+=money
print(sum)
方法一
list1=['name','price','amount']
list=[]
with open('1',encoding='utf-8') as f1:
    for line in f1:
        line=line.strip().split()
        dic = {}
        for i in range(len(list1)):

            dic[list1[i]]=line[i]
        list.append(dic)
print(list)

sum=0
for i in list:
    sum+=int(i['price'])*int(i['amount'])
print(sum)

2,有如下文件:
-------
爱因斯坦是相对论的先驱。
爱因斯坦其实是gay。
----------
将文件中所有的爱因斯坦都替换成大写的SB。
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','爱因斯坦')
        f2.write(new_line)
os.remove('change')
os.rename('change.bak','change')
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}......]
并计算出总价钱。
sum=0
with open('a1',encoding='utf-8') as f1:
    # open('a1.bak',encoding='utf-8',mode='w')as f2:
    l_lst = []
    for line in f1:

        dic = {}  # 字典要放在第一个for 循环下面,这样才能增加不同的字典。
        l1=line.strip().split()  # 此时l1是列表
        # print(l1)

        for i in l1:

            l2 =i.strip().split(':')
            # 将l1中的元素分割成列表l2:l2是动态的,可以表示四个不一样的列表,所以添加列表要和循环对齐。
            # print(l2)
            dic[l2[0]] = l2[1]
        dic.pop('year')  # 删除掉不要的元素year
        l_lst.append(dic)
    print(l_lst)

for i in l_lst:
    sum+=int(i['amount'])*int(i['price'])
print(sum)


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)
4,文件a2.txt
文件内容:
序号 部门 人数 平均年龄 备注
1 python 30 26 单身狗
2 Linux 26 30 没对象
3 运营部 20 24 女生多
通过代码,将其构建成这种数据类型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
......]
并计算出总价钱。

l_lst=[]
with open ('a2',encoding='utf-8') as f:
    l1=f.readline().strip().split()  # 先把第一行读取出来 ['序号', '部门', '人数', '平均年龄', '备注']
    print(l1)
    for line in f:  # 读取剩下的
        dic = {}
        l2=line.strip().split()  # split()以空格分割(多少个空格都可以)
        for i in range(len(l1)):
             dic[l1[i]]=l2[i]  # 用同样的参数,才能确保一一对应
        l_lst.append(dic)
    print(l_lst)


posted @ 2018-05-19 23:44  老虎死了还有狼  阅读(75)  评论(0编辑  收藏  举报