python学习笔记day08 文件操作

文件操作

想要打开一个文件需要:

1.文件所在位置:绝对路径;

2.文件编码方式:utf-8,gbk...;

3.打开文件的方式:只读,只写,追加,读写,写读;

file=open("F:\\workspace_python\\pycharm_projects\\fullstack2018-08-17\\week2\\day01\\xixi.txt",mode='r',encoding='utf-8')
content=file.read()
print(content)
file.close()

文件操作三部曲:打开文件,读取文件内容,关闭文件;

运行结果:

F:\workspace_python\pycharm_projects\venv\Scripts\python.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/01.py
城市越来越大,我们却越来越远。也许我们之间的感情就像杯子一样,碰一碰才不会有距离。

有时候,杯子多了就是一群人的狂欢,其实也是每个人的孤单,心情不好的时候,有谁愿意和我们说话;

有时候我们听不进去别人的批评,也不愿意去多说,总在回忆过去那些兄弟姐妹之间的真心对话;

生活中有些人,走近了又走远了。就像聚会再热闹,总有散伙的一刻;

生活犹如一个杯子,满了,又空了,我们在对话,我们和杯子在对话,我们和自己在对话;


Process finished with exit code 0

注:

1.使用文本文档新建一个文件,这时候open()函数中的参数encoding='utf-8' 就不需要啦,因为默认txt文件不是utf-8??反正我是会报错的,编码方式不写就可以直接打开txt文件啦;

2.但是如果encoding='utf-8' 那么文本文档需要使用记事本打开,另存为的时候下方编码方式需要选择utf-8的形式保存;

3.open()函数中文件的绝对路径的写法有三种:

     a. 路径前面加上 r:

r 'F:\workspace_python\pycharm_projects\fullstack2018-08-17\week2\day01'     #加r 避免\当成转义字符

    b.  \ 变为\\:

"F:\\workspace_python\\pycharm_projects\\fullstack2018-08-17\\week2\\day01\\xixi.txt"   #\---->\\

    c.  \变为/:

F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/xixi.txt

当然由于我的py文件和所要读取的txt文件在同一个目录下,所以可以不用写绝对路径,写相对路径即可:

要注意:文件以什么方式存储就要以什么方式读取~

读:r---读取文件 ; rb 二进制方式读取文件;

file=open("dang",mode='r',encoding='utf-8')
content=file.read()
print(content)
file.close()

运行结果:

F:\workspace_python\pycharm_projects\venv\Scripts\python.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/01.py
我是一个小可爱

当以rb读取时:

file=open("dang",mode='rb',encoding='utf-8')
content=file.read()
print(content)
file.close()

会报错:

Traceback (most recent call last):
  File "F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/01.py", line 11, in <module>
    file=open("dang",mode='rb',encoding='utf-8')
ValueError: binary mode doesn't take an encoding argument

因为文件file本身就是用 rb 二进制读取的(bytes类型本身就是utf-8 参数没必要写啦)

rb:当所要读取的文件是图像类型(非文字)或者是需要上传下载时可以用到 ~b方式

正确写法:

file=open("dang",mode='rb')
content=file.read()
print(content)
file.close()

运行结果:(bytes类型中文表现形式就是b后面十六进制)

b'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe5\xb0\x8f\xe5\x8f\xaf\xe7\x88\xb1'

写:w ----写;wb---二进制方式写;

file=open("dang",mode='w',encoding='utf-8')
content=file.write("大吉大利,今晚吃鸡")
file.close()

wb方式向文件中写内容时,open()函数中的参数encoding就不用写啦,因为本身wb就是以二进制方式写,bytes编码方式就是utf-8 (gbk)~~

但是当你写内容时,是字符串对象,python3中字符串编码方式unicode 所以需要进行转换成utf-8才可以正确写入;

file=open("dang",mode='wb')  #这里wb 已经是bytes类型编码是utf-8了就不用encoding啦
content=file.write("带妹吃鸡,吃鸡萌妹".encode('utf-8'))  #由于所写的内容是str类型,str编码unicode 所以需要str(unicode)-->bytes(utf-8)
file.close()

追加(也是写的一种): a----在文件原来内容基础上追加新内容;ab---以二进制方式追加

file=open("dang",mode='a',encoding='utf-8')  
content=file.write("带妹吃鸡,吃鸡萌妹") 
file.close()

 

file=open("dang",mode='ab') #以二进制方式追加,bytes默认编码utf-8 所以不用再在open()中写encoding
content=file.write("我是追加的内容".encode('utf-8'))  
print(content)
file.close()

 

总结,当以wb 或者 ab 方式忘文件中写入内容时,open()函数中参数encoding 不用再写了,因为bytes类型本身默认编码就是utf-8 ;

写入内容时由于是str 类型,编码方式是unicode 需要进行一个转换str.encode('utf-8') 把unicode编码的str  转换为utf-8编码的bytes;

读写:r+ 读写

上面的r  rb w wb a ab 都是只能读 或者只能写(清空了重新写,覆盖;和追加写),r+是既可以读又可以写:

file=open('dang',mode='r+',encoding='utf-8')
print(file.read())
file.write("哈哈哈")
file.close()

运行结果:

F:\workspace_python\pycharm_projects\venv\Scripts\python.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/01.py
带妹吃鸡,吃鸡萌妹带妹吃鸡,吃鸡萌妹我是追加的内容

然后我们刚才写的‘哈哈哈’已经在文件中啦:

如果我们再在写完之后再读一遍,是不是可以把哈哈哈也读到呢?

file=open('dang',mode='r+',encoding='utf-8')
print(file.read())
file.write("哈哈哈")
print(file.read())
file.close()
View Code

是不可以的~因为r+是读取,可以再写,但是写之后的内容是读不到啦~就是因为写完之后光标已经移至最后一个位置,再度时从光标位置开始,所以后面没有东西当然读不到啦~

我们可以这样操作:

file=open('dang',mode='r+',encoding='utf-8')
print(file.read())
file.write("哈哈哈")
file.seek(0)  #写完之后将光标移至最开始,在进行读取就ok了
print(file.read())
file.close()

 

 其实 r+读写,也可以先写,再读:

file=open('dang',mode='r+',encoding='utf-8')
file.write("哈哈哈")
print(file.read())
file.close()

可以发现此时文件中的内容已经不是在末尾的哈哈哈了,而是从开头开始写,将原来的相应长度的内容覆盖了,然后此时先写再读的话读取的是剩下的原来未被覆盖的内容~

不过一般不这样操作,知道就行啦~

写读: w+ 

file=open("dang",mode='w+',encoding='utf-8')
file.write("我是中国人,我骄傲")
print(file.read())
file.close()

 

可以看出来文件内容已经被新的内容覆盖了,而且w+写完再进行读取时是读不到内容的(类比w写完再进行读操作是会报错的),但是我们可以把光标移动到开头再进行读取:

file=open("dang",mode='w+',encoding='utf-8')
file.write("我是中国人,我骄傲")
file.seek(0)  #写完之后将光标移至开头再进行读取
print(file.read())
file.close()

追加读:a+ 原来a只可以写(追加的方式)现在可以追加完再读:

file=open('dang',mode='a+',encoding='utf-8')
file.write('小日本大坏蛋')
file.seek(0)  #追加完之后把光标移动到开头,可以进行读取(包括追加完的内容)
print(file.read())

 

posted @ 2018-08-24 13:57  写的BUG代码少  阅读(210)  评论(0编辑  收藏  举报