Day03-python基础文件处理

一.文件处理流程

  1.打开文件,得到文件并赋值给变量

  2.通过变量对文件进行操作

  3.关闭文件

#!/usr/bin/python
# -*- coding:utf-8 -*-
# f1 = open('file1',encoding='utf-8')
# data = f1.read()
# print(data)

二.基本操作

2.1文件操作基本流程初探

f = open('file1') #打开文件
first_line = f.readline()
print('first line:',first_line) #读一行
print('分隔符'.center(50,'#'))
data = f.read()# 读取剩下的所有内容,文件大时不要用
print(data) #打印读取内容
 
f.close() #关闭文件

2.2文件编码

文件保存编码如下:

 

此刻错误的打开方式

f=open('chenli.txt',encoding='utf-8')
f.read() 

正确的打开方式

#不指定打开编码,默认使用操作系统的编码,windows为gbk,linux为utf-8,与解释器编码无关
f=open('chenli.txt',encoding='gbk') #在windows中默认使用的也是gbk编码,此时不指定编码也行
f.read()

2.3文件打开模式

1 f = open('文件路径', '模式')

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件内容赋值给变量,日后通过变量对该文件操作。

打开文件的模式有:

  • r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
  • w,只写模式【不可读;不存在则创建;存在则清空内容】
  • x, 只写模式【不可读;不存在则创建,存在则报错】
  • a, 追加模式【可读;   不存在则创建;存在则只追加内容】

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

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

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

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

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

2.4文件内光标移动

注意:read(3)代表读取3个字符,其余的文件内光标移动都是以字节为单位如seek,tell,truncate整理中

2.5open函数详解

1. open()语法

open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
open函数有很多的参数,常用的是file,mode和encoding
file文件位置,需要加引号
mode文件打开模式,见下面3
buffering的可取值有0,1,>1三个,0代表buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小;
encoding表示的是返回的数据采用何种编码,一般采用utf8或者gbk;
errors的取值一般有strict,ignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会忽略而过,继续执行下面的程序。
newline可以取的值有None, \n, \r, ”, ‘\r\n',用于区分换行符,但是这个参数只对文本模式有效;
closefd的取值,是与传入的文件参数有关,默认情况下为True,传入的file参数为文件的文件名,取值为False的时候,file只能是文件描述符,什么是文件描述符,就是一个非负整数,在Unix内核的系统中,打开一个文件,便会返回一个文件描述符。

2. Python中file()与open()区别
两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,相当于这是在构造文件类,而用open()打开文件,是用python的内建函数来操作,建议使用open

3. 参数mode的基本取值

Character Meaning
‘r' open for reading (default)
‘w' open for writing, truncating the file first
‘a' open for writing, appending to the end of the file if it exists
‘b' binary mode
‘t' text mode (default)
‘+' open a disk file for updating (reading and writing)
‘U' universal newline mode (for backwards compatibility; should not be used in new code)

r、w、a为打开文件的基本模式,对应着只读、只写、追加模式;
b、t、+、U这四个字符,与以上的文件打开模式组合使用,二进制模式,文本模式,读写模式、通用换行符,根据实际情况组合使用、

f = open('文件名',‘r’,encoding='utf-8')# 以读的方式打开没有的文件,文件不存在报错
f = open('文件名',‘r’,encoding='utf-8')# 以写的方式打开没有的文件,新建这个文件

 

常见的mode取值组合

r或rt 默认模式,文本模式读
rb   二进制文件
    
w或wt 文本模式写,打开前文件存储被清空
wb  二进制写,文件存储同样被清空
    
a  追加模式,只能写在文件末尾
a+ 可读写模式,写只能写在文件末尾
    
w+ 可读写,与a+的区别是要清空文件内容
r+ 可读写,与a+的区别是可以写到文件任何位置

2.6上下文管理

with open('a.txt','w') as f:
    pass
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
    data=read_f.read()
    write_f.write(data)

2.7文件的修改

import os
f1 = open('file1','r',encoding='utf-8')
f2 = open('file2','w',encoding='utf-8')
for line in f1.readlines():
    if line.startswith('00'):
        line = '456\n'
        f2.write(line)
f1.close()
f2.close()
os.remove('file1')
os.rename('file2','file1')

 三.示例详解

f = open('文件名',encoding='文件编码')
data = f.read()
print(data)
data1 = f.read()#  第二次读时,由于光标读到文章末尾所以读不到内容
print('data=====>',data1)
f.close()
with open('2.png','r',encoding='utf-8') as f:
    print(f.read()) #文件的方式读取不了二进制文件,报错

with open('2.png','rb') as f,open('new_2.png','wb') as f1:
    data = f.read()
    f1.write(data)# 以二进制的形式读取.png文件,并以二进制的形式写入新的文件
#实现log日志新增一行,动态显示一行
import time
with open('file1','r',encoding='utf-8') as f:
    f.seek(0,2)
    while True:
        line = f.readline().strip()
        if line:
            print('新增一行日志',line)
        time.sleep(1)   
f.read(2) # 数字指的是读的字符
with open('file1','r',encoding='utf-8') as f:
    print(f.read(2))
f.seek(2) # seek内指定的数字指的是读的字节
with open('file1','r',encoding='utf-8') as f:
    f.seek(3)
    print(f.tell())# 查看当前光标的位置
    print(f.read())
f.truncate(3) # 数字指的是读的字节
with open('file1','r+',encoding='utf-8') as f:
    f.truncate(3) # 截取前三个字节,后面的所有的内容取消掉
with open('file1','r',encoding='utf-8') as f :
    f.read()
    f.seek(3) # 默认情况,是以文件起始位置作为开始,往后移动3个Bytes
    f.seek(0,1) # 光标定位当前位置
    f.seek(0,2) # 光标移动末尾
    f.seek(-1,2) # 以光标末尾的位置,往前移动一个位置

 

上面的代码由于光标读到文章末尾所以读不到内容,如果将光标移到开始位置就可以读到内容了

f1 = open('file1',encoding='utf-8')
data = f1.read()
print(data)
f1.seek(0)
print('====================>')
data1 = f1.read()
print(data1)
f1.close()

四.读,写功能详解

print(f.close())#判断文件是否是关闭状态
print(f.encoding)# 查看文件编码
print(f.name)#查看文件名字
print(f.readable())#判断文件时候是可读模式打开的
print(f.readline())# 一次读一行
print(f.readline(),end=''#一次读一行,去掉print自带打印的换行符
print(f.readlines())#读取虽有内容,存成列表的形式

print(f.writable())#判断文件是否是课写模式打开的
f.writelines(['\n666\n','777\n'])#以列表的形式写入数据

 

posted on 2017-05-18 21:06  冷无颜  阅读(77)  评论(0编辑  收藏  举报