一、文件操作
   1、 open 打开
    f = open(文件路径,mode = ”模式“,encoding = ”编码格式“)最底层的操作就是bytes
    encoding 表示编码集,根据文件的实际保存编码进行获取数据,对于我们而言更多的是utf-8,记事本的编码格式是GBK。
    打开一个文件时,获取到的是一个文件句柄。通过文件句柄就可以对文件进行操作了,根据打开方式不同,能够执行的操作也会有相应的差异。
# r : read 只读
f = open("大猩猩.txt",mode = "r", encoding = "utf-8")
# 读取内容
f1 = f.read() # 全部都读取出来
print(f)
f2 = f.read() # 读取不到内容,上边已经读取完毕,光标在末尾
print(f2)
# 关闭连接
f.close()
  相对路径: 相对于当前目录所存在的文件夹
                      ../          上一层文件
                     文件夹/    进入xxx文件夹
       绝对路径: 从磁盘根目录开始一直到文件名。
 
 推荐使用相对路径,在我们把程序拷贝给别人的时候,直接把项目拷贝走就能运行,但如果是绝对路径,还需要拷贝用到的外部文件。
 
    日志:程序运行过程中记录得信息。一般保存在绝对路径。
 
2、mode (模式)
    
    r : 读取,只读
 
            读取文件的方式
                  1、read()   默认读取文件的全部内容。弊端:占内存。如果文件过大,容易导致内存奔溃。
                  2、read(n)  读取n个字符。注:如果再次读取,会在当前位置继续去读,而不死从头再读。
                  3、readline() 一次读取一行数据。  注:readline()结尾,每次读取的数据都会有一个  \n 结尾,需要使用strip()方法去    
                        掉 \n 或者空格
                  4、readlines() 将每一行形成一个元素,放到一个列表中,将所有的内容都读取出来。文件过大时,容易内存崩溃。
                  5、循环读取。最重要,最好用。每次读取一行内容。不会产生内存溢出的问题 
                         for  line in f:
 
                注:读取完的文件句柄一定要关闭  f.close()
 
 
  w:  写,只是写
  
         写的时候,如果没有文件,则会创建文件;如果文件存在,则将原件中原来的内容删除,再写入新的内容
         写入完成后,需要刷新管道 f.flush()  
f = open('梦想', mode = 'w', encoding = 'utf-8')
f.write('好声音\n')
f.write('奇葩说\n')
f.write('逻辑思维')
f1 = f.read()
print(f1)   # 报错:not readable
f.flush()
f.close()
a : 
 
            将内容追加写到末尾,也可以创建文件
f = open('心门', mode = 'a', encoding = 'utf-8')
f.write('好声音\n')
f.write('奇葩说\n')
f.write('逻辑思维')
f.flush()
f.close()
r+ :
 
        读写,先读后写,使用频率比较高。
        注:不论读取内容的是多少,只要读了,写入就是从末尾开始。
 
w+:
 
         开始就是清空文件。一般不会用
 
 所有带b 的表示直接操作的时bytes,处理非文本文件的时候。
 rb
 wb
 
 ab:断点续传, 比如在下载文件的时候中断,下次下载的时候,从断点,继续下载。
 
 a+: 追加读,不论是先读还是后读,都读取不到数据。
 
 r + b   w + b   a +b    写病毒的时候可以用到。
 
 
3、文件操作中关于句柄的相关操作
 
  seek()  移动光标
  f.seek(0)  移动到开头
  f.seek(0,2)  移动到末尾
  seek 的两个参数: 1、表示偏移量   2、从xxx开始偏移,默认位0,指开头。 1,指当前位置   2,末尾
 注: 移动的单位都是bytes,所以如果是utf-8的中文部分要是3的倍数。
 
  tell()  返回光标所在的位置
 
 truncate(canshu)
 
        1、如果给了参数,从头截取到参数位置
        2、如果不给参数,从头截取到光标
 
 
4、修改文件中的字段
步骤:
    1、先从文件中读取内容
    2、把要修改的内容进行修改
    3、把修改好的内容写到一个新文件
    4、删除掉原来的文件
    5、把新文件重命名成原来的文件名
import os
f1 = open('心门', mode='r', encoding='utf-8')
f2 = open('心门_副本', mode='w', encoding='utf-8')

for line in f1:
if '' in line:
line = line.replace('','真的非常好,及其好')
f2.write(line)
f1.close()
f2.flush()
f2.close()
# time.sleep(3)
# 删除源文件
os.remove("心门")
# 将新的文件重命名为原来的文件
os.rename('心门_副本','心门')

 

import os
with open('心门', mode='r',encoding='utf-8') as f1 ,\
open('心门_副本', mode='w',encoding='utf-8') as f2:
for line in f1:
if '' in line:
line = line.replace('','真的非常好,及其好')
f2.write(line)

# time.sleep(3)

os.remove('心门')
os.rename('心门_副本','心门')

 

a1.txt  内容如下:

name:apple price:10 amount:3 year:2012
name:tesla price:100000 amount:1 year:2013
name:mac price:3000 amount:2 year:2014
name:lenovo price:30000 amount:3 year:2015
name:chicken price:10 amount:3 year:2016

通过代码,将其构建成这种数据类型:
[{'name':'apple','price':10,'amount':3},
{'name':'tesla','price':1000000,'amount':1}......]
并计算出总价钱。
'''
with open('a2.txt', mode='r', encoding='utf-8') as f:
    lst = []
    sum = 0
    for line in f:
        line = line.strip().split(' ')
        dic = {}
        for c in line:
            c = c.split(':')
            if c[0] =='price' or c[0] =='amount':
                dic[c[0]] = int(c[1])
            else:
                dic[c[0]] = c[1]
        sum += dic["price"] * dic["amount"]
        lst.append(dic)
print(lst)
print(sum)

 

posted on 2018-12-05 21:37  古鲁月  阅读(123)  评论(0编辑  收藏  举报