python 文件处理

变量 = open(r'文件路径)','r[打开文件模式]',encoding='utf-8文本字符集[默认是unicode]')
win 需要在路径上加 r ,字符集跟文件写入的格式.

(1). 打开文件的模式有(默认为文本模式[test]):
r,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a,只追加写模式【不可读;不存在则创建;存在则只追加内容】

(2). 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

(3),‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】--- 文件必须存在
w+,写读【可写,可读】 --- 文件没有存在,直接创建
a+, 写读【可写,可读】

(4),以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】

2. 操作方法
read
  1. 文件打开方式为文本模式时,代表读取3个字符
  2. 文件打开方式为b模式时,代表读取3个字节
其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate
注意:
  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。(先清空,在写)


 w --模式写 光标先从头开始,先清空,在写
 
 writable()  ---判断文件是否可写 -- True/False
 实例:
 f=open(r'a.txt','w',encoding='utf-8')
 print(f.writable())
 f.close()

 True

 write()  ---直接写,默认追加最后,每次都是从头在
 实例:
 f=open(r'a.txt','w',encoding='utf-8')
 # print(f.writable())
 f.write('1111\n')
 f.close()
 1111
 
 writelines()  ---可以已列表,元祖,字典方式写入
 f=open(r'a.txt','w',encoding='utf-8')
 f.writelines(['3333\n','44444\n'])
 f.close() 
 3333
 44444
 
 a ---模式追加 文件不存在则创建,文件存在那么打开文件后立刻将光标移动最后.
 
 r ---读模式,必须文件存在
 
 read.() ---文件全部读在内存中,建议小文件
 
 readlines()  ---文件全部读在内存中,但是放在列表中显示
 
 readline(),end='' ---一次读一行,默认会带一个换行符,加上end='' 指定空
 
 循环打印:
 with open('b.txt','r',encoding='utf-8') sa f: #f 指定变量名字
  for i in f:
   print(i)
   
 b ---bytes 二进制读,不能指定字符编码,解码文本格式加.decode('utf-8')
 with open('b.txt','rb',) as f:
  print(f.read().decode('utf-8'))

 python cp 命令:
 
 import 函数用于动态加载类和函数
  os模块

 os.remove(path)
  删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。

 os.rename(src, dst)
  重命名文件或目录,从 src 到 dst
 
 实例:
 import os
 
 with open('a.txt','r',encoding='utf-8') as f ,\
          open('.a.txt.swap','w',encoding='utf-8') as o:
     # data = f.read()
     # o.write(data.replace('alex','ALEX')) #方法一:只适合小文件
     for i in f:
         print(i)
         o.write(i.replace('alex', 'ALEX'))
 os.remove('a.txt')
 os.rename('.a.txt.swap','a.txt') 
  
 
 replace('旧','新',' 替换不超过 max 次(不在全部)')
 
 split()
 指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num 个子字符串
 语法
 split() 方法语法:
 str.split(str="", num=string.count(str)).
 
 参数
 str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
 num -- 分割次数。
 
 实例
 以下实例展示了split()函数的使用方法:
 #!/usr/bin/python

 str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
 print str.split( );
 print str.split(' ', 1 );
 以上实例输出结果如下:
 ['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
 ['Line1-abcdef', '\nLine2-abc \nLine4-abcd']

 '''
 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_info = []

 with open(r'b.txt','r',encoding='utf-8') as f:
  for i in f:
   list = i.split()
   print(list)
   list_info.append({'name':list[0],'price':int(list[1]),'count':int(list[2])})
  # money = list(map(lambda x:x['price']*x['count'],list_info))
  money = map(lambda x: x['price'] * x['count'], list_info)
  ss = sum(money)
  print('共消费 %d 元'%ss)
 print(list_info)
  
 
 2,有如下文件:
 '''
 -------
 alex是老男孩python发起人,创建人。
 alex其实是人妖。
 谁说alex是sb?
 你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
 ----------
 将文件中所有的alex都替换成大写的SB。
 '''

 import os

 with open('a.txt','r',encoding='utf-8') as f ,\
    open('.a.txt.swap','w',encoding='utf-8') as o:
  # data = f.read()
  # o.write(data.replace('alex','ALEX')) #方法一:只适合小文件
  for i in f:
   print(i)
   o.write(i.replace('alex', 'ALEX'))
 os.remove('a.txt')
 os.rename('.a.txt.swap','a.txt')

2. 控制光标移动
创建一个文件:a.txt
helli你好

with open('a.txt','r',encoding='utf-8') as f:
 data1=f.read()
 print(data1)
 print(f.tell()) #告诉光标在什么位置,显示是以 字节
 #只有一种情况下光标以字符为单位: 文件以rt方式打开,read(3)
 #方法一:
 f.seek(0)
 
 #方法二: f.seek('移动的数','参照物,默认是0'),--只有t模式下,还可以使用0,1和2不可以
 #有三种模式0,1,2 (0是首尾,1是当前的位置,2是以末尾)--1和2 必须在b 模式下使用
 f.seek(0,0)

tail -f access.log

截断文件:
 只能用a模式 ,如果使用w模式,直接清空

 with open('access.log','a',encoding='utf-8') as f:
  f.truncate(3)  #没有0,1,2 全都是从头开始

posted on 2018-04-19 21:35  python21-李伟  阅读(138)  评论(0编辑  收藏  举报

导航