Python基础 ( 五 ) —— 文件处理

#文件处理

注:
#windows下的换行为\r\n ,linux下为\n
#windows默认系统编码方式为gbk(ANSI) ,mac为utf8 。故在windows下得指定编码方式
#windows下打开记事本另存为时可以查看编码方式

#当不知道文件编码方式时,open函数 encoding = ' latin-1 ' 可以识别大多数编码方式(不包括中文)

#pycharm 在windows下默认显示的时候把\r\n 改成\n ,但实际上还是\r\n,故在使用tell()函数时的计数要小心

所以使用newline参数可以解决这个问题:

在Python 3,可以通过open函数的newline参数来控制Universal new line mode:

读取时候,不指定newline,则默认开启Universal new line mode,所有\n, \r, or \r\n被默认转换为\n ;

写入时,不指定newline,则换行符为各系统默认的换行符(\n, \r, or \r\n, ),

指定为newline='\n',则都替换为\n(相当于Universal new line mode);

不论读或者写时,newline=''都表示不转换

 

f = open('C:\\Users\\ssy\\Desktop\\1.txt','w+',newline='')    
f.write('1111\r\n2222\r\n3333\r\n')
print(f.tell())
f.seek(0,0)              #指针(光标)回到开头,下文有详细用法
print(f.readlines())
f.close()

#for循环文本(文件句柄)为一行一行读取

with open('text111','rb') as f :
    for i in f :                   -->无需f.readlines()-->一次读取所有行,占用内存大
        print(i)

#获取最后一行的一种思路

 

with open('text111','rb') as f :
    num = -10
    while True :
        f.seek(num,2)
        data = f.readlines()
        if len(data) > 1  :                                  
            print(data[-1].decode('utf-8'))
            break
        num *= 2

 

 

 

#文件打开模式

r            只读

w        只写

a   只追加

x      只读,没文件会报错

#open中的mode参数

'r'  'w'  'a'  'x'

#以下注意!!!

'w+'   == w + r    #假定open的文件存在的情况下:以w的形式open 并加上r功能 (打开一个空文件,执行操作后覆盖回原文件)

 

f = open('text1','w+',encoding='utf-8')  --> f称为文件句柄
data = f.readlines()                     --> data 的值为空 ,因为w+ 是开一个空文件,无论之前该文件里有何内容都无关
print(data)
f.write('\n11\n22\n33\n44\n')            --> 写入文本
data1 = f.readlines()            
print(data1)                             --> data1 的值仍然为空,因为读取是从写入的文本的最后开始读取
f.close()

 

'a+'   == a + r      #假定open的文件存在的情况下:以 a 的形式open 并加上r功能(打开原文件,从文件的末尾开始执行操作)

 

f = open('text1','a+',encoding='utf-8')
data = f.readlines()                     --> data 的值为空 ,因为a+ 是打开原文件,但是从末尾开始执行操作,此时末尾无字符,读取的为空
print(data)
f.write('\n11\n22\n33\n44\n')            --> 追加文本
data1 = f.readlines()            
print(data1)                             --> data1 的值仍然为空,因为读取是从追加的文本的最后开始读取(为空)
f.close()

 

 

 

'r+'   == r + w    #假定open的文件存在的情况下:以 r 的形式open 并加上w功能(打开原文件,从文件的开头开始执行操作)

 

f = open('text1','r+',encoding='utf-8')
data = f.readlines()                     --> data 的值为原文件里的文本 ,因为a+ 是打开原文件,从开头开始执行操作
print(data)
f.write('\n11\n22\n33\n44\n')            --> 读取完文件后,光标到达文件末尾,从末尾写入文本
data1 = f.readlines()            
print(data1)                             --> data1 的值仍然为空,因为是从写入文本的最后开始读取(为空)
f.close()

 

 

 

'x+'   == x + r

#文件处理t模式(默认)

#文件处理操作

#open函数(open的值称为文件句柄)

f = open('C:\\Users\\ssy\\Desktop\\1.txt', 'r' ,encoding='utf-8')
#注意路径分隔符为\\ ,不指定路径只输入文件名(1.txt)则需要文件与py代码文件的路径一致  
#open函数如果不指定编码方式,默认使用当前系统的编码读取文本
#第二个参数 'w' 代表 只写模式(不可读),不输入默认为 r 只读模式
text = f.read() print(text) f.close()

#read函数

f = open('C:\\Users\\ssy\\Desktop\\1.txt',encoding='utf-8')
a = f.readable()                          -->判断是否可读
b = f.readline()                -->一次读取一行,第一行开始(下一行有文本的情况下,读取完默认换行(实际上顺序读取每一行的每个字符,包括隐藏的\n))
c = f.readline()
d = f.readlines()               -->从当前光标位置开始(如上面调用了readline函数,从调用后的光标位置开始),读取所有行,存入列表中
print(a) print(b , end='')
print(d) f.close()

#文件处理操作(默认的写入编码为open里指定的编码方式)

#write函数

f = open('C:\\Users\\ssy\\Desktop\\1.txt','w',encoding='utf-8')
# w (只写) 模式下,直接开一个新文件覆盖原文件(相当于清空了原文件),再开始下一步操作.
#若没有此文件,则会创建
f.write('111111 the first line\n')
f.write('end 0,0\n Aha ! you were tricked !\n')
f.writable()                                    #判断是否 只写 模式
f.writelines(['aaa\n','123','bbb',['abc']])     #注意文件里都为字符串类型,故也只能写入字符串
f.close()

#文件处理追加操作

f = open('C:\\Users\\ssy\\Desktop\\1.txt','a',encoding='utf-8')
f.write('write in the end \n')
f.close()

#文件处理with语句(打开文件执行完操作后自动关闭文件)

with open('text1','w',encoding='utf-8') as f :
    f.write('hello world~\n')

#同时打开多个文件进行操作

 

with open('text1','w',encoding='utf-8') as f , open('text2','w',encoding='utf-8') as f1 :       #此操作 open文件有先后顺序(左到右)
    f.write('hello world~\n')
    f1.write('I hate the world !!!\n')

 

 #文件处理b模式(上文的其实都省略了一个默认的t ,即 r 为 rt ,w 为wt ,以文本模式处理)

#优点:

#跨平台通用(不同操作系统)

#可以处理非文本文件,如视频、图片之类(上文的t模式就不行)

#Linux 默认以b模式处理

#rb wb ab rb+ wb+ ab+ 以字节的形式的方式处理文件 --> i.e. 把字符串分割成一个一个字节输出

#写入文本的过程 : 字符串 --> encode --> bytes --> bit 

#读取文本的过程(open): bit --> bytes --> decode -->字符串

#rb 模式

f = open('C:\\Users\\ssy\\Desktop\\1.txt','rb')
data = f.read()                          #读取的是bytes
data1 = data.decode(encoding='utf8')     #将bytes用指定编码方式解码
print(data)
print(data1)
f.close()

#wb 模式

 

#写入的不能是字符串,而是要编码成bytes

 

 

f = open('C:\\Users\\ssy\\Desktop\\1.txt','wb')
a = '这是我要输入的内容\r\n'                    #windows下的换行\r\n
f.write(a.encode('utf8'))                    #两种编码函数
f.write(bytes(a,encoding='utf8'))
f.close()

 

#ab 模式(同理)

 

f = open('C:\\Users\\ssy\\Desktop\\1.txt','ab')
a = '这是我要输入的内容\r\n'
f.write(a.encode('utf8'))
f.write(bytes(a,encoding='utf8'))
f.close()

 #文件操作的其他方法

f = open('text','w',encoding = 'utf8')

f.closed                       #判断文件是否关闭

f.encoding                  #输出open使用(i.e.文件打开的编码方式)的编码方式(不同平台有不同的名字,如cp936就是GBK)

f.flush()                       #刷新 , 将写入的内容写入磁盘中(保存),否则默认是文件关闭的时候保存

f.name                         #返回文件的绝对路径(包括文件名)

f.tell()                          # 返回当前光标所在的位置(一个字节一位,故别忘了\n 或者\r\n)

#控制文件内指针(光标)的移动

#文件内指针移动,只有在read()下光标以字符移动

#除此以外文件内指针的移动都是以字节为单位

#read()函数

read(n)       #从当前光标处读取n个字符

#seek()函数 (指针(光标)的移动) !!!!!!

如果f.seek(n)只有一个参数( 默认以0为参考位置),代表跳到第n个光标位置!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!超级实用

f.seek(offset,whence)如果有两个参数:

offset代表控制指针移动的字节数

whence:代表参照什么位置进行移动

whence=0: 参照文件开头                         -->需要b模式

whence=1: 参照当前所在的位置             -->需要b模式

whence=2: 参照文件末尾                         -->需要b模式

 

with open('text111','rb') as f :
    f.seek(-5,2)                    -->倒着移动指针
    print(f.read(1))

 

 

 

#因为seek是以字节为单位来移动,如果不是b模式,移动到中文(如GBK 占两个字节)的字节位置会出错

f = open('C:\\Users\\ssy\\Desktop\\1.txt','w+',newline='')
f.write('1111\r\n2222\r\n3333\r\n')
f.seek(0,0)
f.write('')
f.seek(0,0)
print(f.read())
f.close()

#文本截取truncate()

#Python 文件 truncate() 方法用于截断文件并返回截断的字节长度。

#指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。

#注意是从头开始截断,不依赖于指针位置

 

f = open('C:\\Users\\ssy\\Desktop\\1.txt','w+',newline='')
f.write('1111\r\n2222\r\n3333\r\n')
f.seek(6)
print(f.tell())
print(f.read(4))
f.truncate(4)
f.close()

 

posted @ 2018-12-23 00:29  Matrixssy  阅读(317)  评论(0)    收藏  举报