python 【文件操作】

python 文件操作

  使用python程序对文件进行操作,必要参数

  1,文件路径 D:\log.txt 相对路径 绝对路径
  2,编码方式:utf-8。
  3,动作mode,读,读写,写读.....

一、文件操作流程

  1,打开文件,产生文件句柄。设置一个变量(特殊变量)。可设置为:file,f_handle,file_handle,f_obj

    文件句柄=open('文件路径',‘模式’)
  2,操作文件句柄。
  3,关闭文件。f1.close

  mode:动作

  r模式,默认模式,文件不存在则报错

  w模式,文件不存在则创建,文件存在则覆盖

  a模式,文件不存在则创建,文件存在则不会覆盖,写内容会以追加的方式写(写日志文件的时候常用),追加模式是一种特殊的写模式

  b(rb,wb,ab)模式:不用加encoding:utf-8

#绝对路径
f1 = open('D:\log.txt', encoding='utf-8', mode='r')
content = f1.read()
print(content)
f1.close  #很重要,如果不关闭则会一直占用内存。
#相对路径
f1 = open('log1.txt', encoding='utf-8', mode='r')
content = f1.read()
print(content)
f1.close 

  4、报错

1、  SyntaxError: (unicode error) 'unicodeescape' codec
     can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
     f1 = open(r'D:\log.txt', encoding='utf-8', mode='r')
     # f1 = open('D:\\log.txt', encoding='utf-8', mode='r')
 2、EncodeDecodeErorr: 编码错误。

  

二 、模式:mode

  • r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
  • w,只写模式【不可读;不存在则创建;存在则清空内容】
  • x, 只写模式【不可读;不存在则创建,存在则报错】
  • a, 追加模式【可读;   不存在则创建;存在则只追加内容】
#read 全部读出
read 全部读出
f1 = open('log1.txt', encoding='utf-8')
content = f1.read()  #
print(content)
f1.close()

#read(n) 
f1 = open('log1', encoding='utf-8')
content = f1.read(5)  # r 模式 按照字符读取。
print(content)
f1.close()

#readline()按行读取 操作不方便
f1 = open('log1.txt', encoding='utf-8')
print(f1.readline())
print(f1.readline())
print(f1.readline())
print(f1.readline())
f1.close()

#readlines() 将每一行作为列表的一个元素并返回这个列表 
f1 = open('log1', encoding='utf-8')
print(f1.readlines())
f1.close()

#for循环 大文件读取最好(在内存中永远只占一条空间)
f1 = open('log1', encoding='utf-8')
for i in f1:
    print(i)
f1.close()

#w模式
f1 = open('log2', encoding='utf-8', mode='w')
f1.write('alex是披着高富帅外衣的纯屌丝.....')
f1.close()
f1 = open('log2', mode='wb')
f1.write('alex是披着高富帅外衣的纯屌丝.....'.encode('utf-8'))
f1.close()

#w+ 写读模式
f1 = open('log2', encoding='utf-8', mode='w+')
print(f1.read())
f1.write('666')
f1.close()

#a ab 追加
f1 = open('log2', encoding='utf-8', mode='a')
f1.write('\n老男孩')
f1.close()

#a+
f1 = open('log2', encoding='utf-8', mode='a+')
f1.write('fdsafdsafdsagfdg')
f1.seek(0)
print(f1.read())
f1.close()

  

"+" 表示可以同时读写某个文件

  • r+, 读写【可读,可写】
  • w+,写读【可读,可写】
  • x+ ,写读【可读,可写】
  • a+, 写读【可读,可写】

 "b"表示以字节的方式操作

  • rb  或 r+b
  • wb 或 w+b
  • xb 或 w+b
  • ab 或 a+b

 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

#编码的补充:\
s1 = b'\xd6\xd0\xb9\xfa'
s2 = s1.decode('gbk')
s3 = s2.encode('utf-8')
print(s3)  # b'\xe4\xb8\xad\xe5\x9b\xbd'
s1 = b'\xd6\xd0\xb9\xfa'.decode('gbk').encode('utf-8')
print(s1)

  

三、with open () as 自动关闭文件,但是不适用于对于单文件读写一起的操作。可单读 或 单写

# with open() as:(支持多个文件一起操作,单都是单项读 或写)
with open('log1', encoding='utf-8') as f1,\
        open('log2', encoding='utf-8', mode='w')as f2:
    print(f1.read())
    f2.write('777')

 

四、文件的改

1,打开原文件,产生文件句柄。
2,创建新文件,产生文件句柄。
3,读取原文件,进行修改,写入新文件。
4,将原文件删除。
5,新文件重命名原文件。
# import os
with open('file_test', encoding='utf-8') as f1,\
    open('file_test.bak', encoding='utf-8', mode='w') as f2:
    old_content = f1.read() #read 将全文件读出来不好
    new_content = old_content.replace('alex','SB')
    f2.write(new_content)
os.remove('file_test')
os.rename('file_test.bak','file_test')

#优化后,for循环read
import os
with open('file_test', encoding='utf-8') as f1,\
    open('file_test.bak', encoding='utf-8', mode='w') as f2:
    for line in f1:
        new_line = line.replace('SB','alex')
        f2.write(new_line)  
os.remove('file_test')
os.rename('file_test.bak','file_test')

  

五、文件内光标移动

一: read(3):

  1. 文件打开方式为文本模式时,代表读取3个字符

  2. 文件打开方式为b模式时,代表读取3个字节

二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

注意:

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

      seek控制光标的移动,是以文件开头作为参照的。

   tell当前光标的位置

  2. truncate是截断文件,截断必须是写模式,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

tell 告诉指针的位置
f1 = open('log2', encoding='utf-8', mode='w')
f1.write('fdsafdsafdsagfdg')
print(f1.tell())
f1.close()
seek(参数),seek(0,2) 调至最后 按照字节去调整光标

  

 

posted @ 2018-04-20 17:24  大程为重  阅读(185)  评论(0)    收藏  举报