Day8 python基础

一,文件操作初识

1.文件名

2.文件路径

   绝对路径:从根目录一层层开始找   

 相对路径:从当前目录开始找

   路径问题报错:

       1、在路径的最前面加r,对每个反斜杠进行转意:r'd:\a.txt'

       2、每个\都加\,变成\\,对每个\都转意:d:\\a.txt

3.打开方式:只读,只写,写读,读写,追加,等等

4.编码方式

    Error:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf in position 25: invalid continuation byte

    报错原因:编码不一致

#文件操作初识
#

f = open('d:\护士主妇空姐私密联系方式.txt',encoding='utf-8',mode='r')
content = f.read()
print(content)
f.close()

'''
f 变量:f_obj,f_handler,f_h,fh,文件句柄
open():为python的内置的系统函数(内部调用的是windows的系统命令,不同操作系统,python会自动识别并调用)
流程:
1.打开文件,产生文件句柄
2.对文件句柄进行操作
3.关闭文件句柄
'''

 

二,文件编码

  f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

#若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f=open('a.txt','r',encoding='utf-8')

 

三,文件的打开模式

#

#r:只读 *****
#对于r模式,mode可以默认不写
#例:
f = open('文件操作',encoding='utf-8')
content = f.read()
print(content)
f.close()

# rb:以字节方式读取读,
文件操作中凡是带b字母,都是与非文字类文件相关的 ***
#例
f = open('美女1.jpg',mode='rb') #rb模式按照字节读取
content = f.read()
print(content)
f.close()

#r+:读写 *****
#一般情况:先读后追加
#注意:
#不读,光标默认在文件头,后写,会覆盖字符
#先写后读,光标在文件末,再读,读不出数据
例:
f = open('文件操作',encoding='utf-8',mode='r+')
centent = f.read()
print(centent)
f.write('好好好')
f.close()

#r+b 以bytes类型操作的读写,写读,写读模式
#例:
f = open('文件操作',mode='r+b')
content = f.read()
print(content.decode('utf-8'))
a = '老衲好'
f.write(a.encode('utf-8'))
f.close()

#

#w:只写 ***
#没有文件,创建文件也要写
#有文件,先清空,后写入
#例:
f = open('文件操作2',encoding='utf-8',mode='w')
f.write('深圳市南山区,福田区,罗湖区...')
f.close()

#wb:以字节方式写 **
f1 = open('美女1.jpg',mode='rb')
content = f1.read()
f = open('美女2.jpg',mode='wb')
f.write(content)
f1.close()
f.close()

#w+:写读
#先清空,后写,光标在文末,再读,无内容
#w+b:写读,以字节形式
#追加

#a:追加 ***
# 没有文件,创建文件也要写。
# 有文件,直接在文件的最后面追加。
#例子:
f = open('文件操作3',encoding='utf-8',mode=a)
f.write('\n南方水土好')
f.close()

#ab:以字节形式追加
#a+ :先追加后读
#a+b:写读
文件读取的方法:
#
1、read():全部读取
f = open('文件操作',encoding='utf-8',mode='r')
content = f.read()
print(content)
f.close()
# 2、read(n):读取n个字符 f = open('文件操作',encoding='utf-8',mode='r')
content = f.read(10) #读取n个字符,换行符,空格也算字符,r模式按字符读,b模式按字节
print(content)
f.close
# 3、readline():按行读取,读取一行 f = open('文件操作',encoding='utf-8',mode='r')
print(f.readline())
print(f.readline()) #光标下移,读取下一行
# 4,readlines():多行读取 f = open('文件操作',encoding='utf-8',mode='r')
content = f.readlines() #返回一个list
print(content)
f.close
#5.for 循环,读取时值占用一条的内存,句柄f为可迭代的数据,所以f的最小元素为行 f = open('文件操作',encoding='utf-8',mode='r')
for line in f: print(line.strip()) f.close()
# 其他方法:py3.x

# seek 调整光标到开始,seek(0)  调整光标到结尾seek(0,2) *****
f = open('文件操作1',encoding='utf-8')
f.seek(6)        # 按照字节去移动光标
content = f.read()
print(content)
f.close()

# fileno()  文件描述符:文件的内存地址

# flush()  刷新:强制保存

# readable() 判断文件句柄是否可读,返回布尔值
f = open('文件操作1',encoding='utf-8')
if f.readable():
    content = f.read()
    print(content)
f.close()

# writealeb()判断文件句柄是否可写,返回布尔值
f = open('文件操作1',encoding='utf-8')
if f.writable():
    f.write('123')
f.close()

#seekable()判断是否可以调整光标,用处不明

#tell()获取光标位置,应用:断点续传*****
f = open('文件操作1',encoding='utf-8')
f.seek(0,2) # 按照字节去移动光标
print(f.tell())
f.close()

#truncate()在原文件截断数据,仅保持从开头至截取处,
# 需要支撑写的情况下才能用,writealbe,返回截取的字节数,不能在W模式使用,会先清空原文件,建议r+,a+
f = open('文件操作1',encoding='utf-8',mode='r+')
print(f.truncate(6))
f.close()
# 1,主动关闭文件句柄
with open('文件操作2',encoding='utf-8') as f1:
    print(f1.read())
# 2,开启多个文件句柄。
with open('文件操作2',encoding='utf-8') as f1,\
        open('文件操作3',encoding='utf-8',mode='w') as f2:
    print(f1.read())
    f2.write('666666')
# 文件的改的操作

# 1,以读的模式打开原文件,产生一个文件句柄f1.
# 2,以写的模式创建一个新文件,产生一个文件句柄f2.
# 3,读取原文件内容,进行修改,并将修改后的写入新文件。
# 4,将原文件删除。
# 5,将新文件重命名成原文件。

#  low版
import os
with open('alex的深度剖析', encoding='utf-8') as f1,\
    open('alex的深度解析.bak',encoding='utf-8',mode='w') as f2:
    old_content = f1.read()
    new_content = old_content.replace('alex','SB')
    f2.write(new_content)
os.remove('alex的深度剖析')
os.rename('alex的深度解析.bak', 'alex的深度剖析')
#

import os
with open('alex的深度剖析', encoding='utf-8') as f1,\
    open('alex的深度解析.bak',encoding='utf-8',mode='w') as f2:
    for line in f1:
        new_line = line.replace('SB','alex')
        f2.write(new_line)
os.remove('alex的深度剖析')
os.rename('alex的深度解析.bak', 'alex的深度剖析')

 

posted @ 2018-08-13 19:54  乘地铁  阅读(161)  评论(0)    收藏  举报