前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3学习笔记 | 九、Python的类型与运算-文件

Python3学习笔记 | 九、Python的类型与运算-文件

作者头像
TeamsSix
发布2019-09-24 16:39:41
5790
发布2019-09-24 16:39:41
举报
文章被收录于专栏:TeamsSix的网络空间安全专栏

一、文件简介

文件对象在Python里是可以作为OS(操作系统)上的文件的链接。 文件对象的使用方式与之前的字符串、列表等对象不同,它是对文件的输入、输出进行控制。 在Python里会用open函数(方法)来进行文件的控制。(也有其它方法可以进行文件的读取与写入)

二、文件的访问

在Python里使用open函数(方法)可以访问文件。

基本格式是:open([, access_mode])

这里的文件地址是文本形式,在Windows里,由于文件地址是使用反斜杠(\),所以,可以使用r来对反斜杠不进行转译。

open(r’C:\mydir\myfile’)

访问模式里是参数,默认是r(读取),其他方式下面还会有提及。

在访问模式,每一种方法都有一种使用到b的方式,就是二进制模式。这个在Python 2.x里没有区别,因为python2.x默认是二进制模式,在Python3.x里默认的字符是unicode方式。

正常使用文本的时候,不需要使用二进制方式,在需要特殊用途的时候是需要以二进制方式来存储、读取的。

操作模式:

r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 r+ 打开一个文件用于读写。文件指针将会放在文件的开头。 rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

三、文件的使用

• 迭代器是最好的读行工具 - 比如: 使用for循环 • 内容是字符串,不是对象 - 文件读取完之后,内容是以字符串的形式读取的。 • close是通常选项 - 当你使用完文件之后,使用close()方法来关闭文件关联。 • 文件是缓冲的而且是可查找的 - flush或close()方法可以直接存储缓存里的内容, seek方法可以转到指定位置。 当我们使用文件的时候,跟其它对象一样,用一个变量来引用。

代码语言:javascript
复制
>>> file = open('./test.txt','w')

然后对变量进行操作

代码语言:javascript
复制
>>> file.write('DoraEmon')
8

在这里,Python3.x是有返回输入长度,但Python2.x是没有的。

代码语言:javascript
复制
>>> file.close
>>> file = open('./test.txt','r')
>>> file.read()
'DoraEmon'

四、文件的读取

1、最基本的读取

读:当我们以r的模式读取文件后,可以用以下方法来读取内容。

代码语言:javascript
复制
PS C:\Users\Administrator>cat C:\Test\test.txt
Dora
Emon

这里先是有一个提前创建的文件,文件名叫test.txt,在C:\Test目录下。 read()方法就是从头到尾读一遍。刚刚读取文件后,其指针在最前面,读完之后指针在最后面,指针位置可以用tell()方法来查看。

代码语言:javascript
复制
>>> output = open(r'C:\Test\test.txt')
>>> output.tell()
0
>>> output.read()
'Dora\nEmon'
>>> output.tell()
10

2、按需求读取

当我们需要只读取前4个字符,读到Dora:

代码语言:javascript
复制
>>> output = open(r'C:\Test\test.txt')
>>> output.read(4)
'Dora'
>>> output.tell()
4

之后,就是从指针所指的地方开始读取:

代码语言:javascript
复制
>>> output.read()
'\nEmon'

我们也可以按行读取:

代码语言:javascript
复制
>>> output = open(r'C:\Test\test.txt')
>>> output.readline()
'Dora\n'
>>> output.readline()
'Emon'

也可以使用一个函数,把指针随意放在想要的位置,然后读取:

代码语言:javascript
复制
>>> output.seek(4)
4
>>> output.tell()
4
>>> output.read()
'\nEmon'

五、文件的写入

1、基本写入

当我们需要写入到一个文件的时候,会使用w模式。当相应的文件存在时,会清空原先的文件然后写入,当相应的文件不存在时会创建新的文件。

代码语言:javascript
复制
>>> input = open(r'C:\Test\input_test.txt','w')
>>> input.write('Dora Emon')
9
>>> input.write('DaXiong And JingXiang')
21
>>> input.flush()
>>> input.close()PS C:\Users\Administrator> cat C:\Test\input_test.txt
Dora EmonDaXiong And JingXiang

在这里,flush()方法是把缓存里的内容写入硬盘中。当运行close()方法的时候,也会进行同样操作。

2、按列表内容写入

代码语言:javascript
复制
>>> lines = ['DoraEmon\n','DaXiong And JingXiang\n']
>>> input = open(r'C:\Test\input_test.txt','w')
>>> input.writelines(lines)
>>> input.close()PS C:\Users\Administrator> cat C:\Test\input_test.txt
DoraEmon
DaXiong And JingXiang

writelines是把列表里的元素一个一个输入进去。当然,元素里的字符串最后没有换行,最终结果也不是换行的。

3、在特定位置写入

代码语言:javascript
复制
>>> input = open(r'C:\Test\input_test.txt','w')
>>> input.write('Dora')
4
>>> input.seek(0)
0
>>> input.write('Emon')
4
>>> input.close()PS C:\Users\Administrator> cat C:\Test\input_test.txt
Emon

这里的话,当我们输入错误的时候,可以把指针挪到最前面,然后继续输入。seek可以有两个传递变量,只有一个变量时,就是更改当前的指针,或者第一个变量为0,第二个变量为1的时候,会返回当前指针位置,这个与tell方法同样。最后,第一个变量为0,第二个变量为2的时候会把指针放到最后。

4、在最后写入

之前看到的w模式,当文件是已有文件,就会删除里面的所有内容后再写入的。当我们需要在最后添加,而不是删除原有内容时,可以使用a模式。

代码语言:javascript
复制
>>> file = open(r'C:\Test\test.txt','r')
>>> file.read()
'Dora\nEmon'
>>> file.close()
>>> file = open(r'C:\Test\test.txt','a')
>>> file.write('DaXiong')
7
>>> file.close()PS C:\Users\Administrator> cat C:\Test\test.txt
Dora
EmonDaXiong

我们会看到,a模式不会去更改原来的文件,而且每次写入也不会更改之前写入的内容。

六、文件的读写

在模式里,我们会看到r+, w+, a+ 三种模式都有读写的方法。 r+模式,只能打开已有文件,打开时保留原有文件,对文件可读,可写,也可更改原有内容。打开时指针在文件最前面。 w+模式,打开时没有相应文件,会创建;有相应文件,会删除里面所有内容后打开。之后的操作与r+完全相同。 a+模式,可以打开原有文件,也可创建新的文件,打开时指针为文件的最后位置。指针可以放到任何位置来读内容,但写入时,指针默认会移动到最后,然后写入。

模式 打开已有文件 打开新的文件 打开时指针位置 写入时指针位置 r+ 保留内容 发生错误 文件开头 当前位置 w+ 删除内容 创建文件 文件开头 当前位置 a+ 保留内容 创建文件 文件尾端 文件尾端

其余模式可参考https://blog.csdn.net/qq_35203425/article/details/80904428

七、文件的访问 - b模式

在Python里可以使用二进制方式读取和写入文件。 这个模式,在Python2.x里不会有什么特别,因为在2.x里存储方式就是二进制方式。

代码语言:javascript
复制
>>> a = '啊'
>>> a
'\xe5\x95\x8a'

但是在Python3.x里是unicode方式:

代码语言:javascript
复制
>>> a = '啊'
>>> a
'啊'

所以在存储的时候,我们可以使用二进制模式,或者正常模式。

代码语言:javascript
复制
>>> a='啊'.encode()
>>> a
b'\xe5\x95\x8a'

这之后,可以使用二进制方法来存储。

八、文件与其他类型 - 原生对象的存取

存储一些对象的时候,比如说列表,字典等;Python都需要把这些对象转换成字符串后存储:

代码语言:javascript
复制
>>> file = open(r'C:\Test\test.type','w')
>>> file.write({'a':97})
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not dict
>>> file.write(str({'a':97}))
9
>>> file.write(str([1,2]))
6
>>> file.close
<built-in method close of _io.TextIOWrapper object at 0x00000256209BF558>PS C:\Users\Administrator> cat C:\Test\test.type
{'a': 97}[1, 2]

这样,读取的时候会出现我们得再次转换的问题,这个时候,我们可以用pickle模块:

代码语言:javascript
复制
>>> import pickle
>>> file = open(r'C:\Test\test.type','wb')
>>> a = {'a',97}
>>> pickle.dump(a,file)
>>> file.close()PS C:\Users\Administrator> cat C:\Test\test.type
€cbuiltins
set
q ]q(KaX   aqe卶Rq.

>>> file = open(r'C:\Test\test.type','rb')
>>> a = pickle.load(file)
>>> a
{97, 'a'}PS C:\Users\Administrator> cat C:\Test\test.type
{'a': 97}[1, 2]
q ]q(KaX   aqe卶Rq.

pickle.dump(obj, file[, protocol]) 序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。 pickle.load(file) 反序列化对象。将文件中的数据解析为一个Python对象。 关于pickle模块详细介绍可以参考https://blog.csdn.net/sxingming/article/details/52164249

九、文件操作中会用到的其它工具

在Python里,我们可以使用os模块里的方法对文件进行操作:

代码语言:javascript
复制
PS C:\Users\Administrator> cd C:\Test
PS C:\Test> echo '' > file
PS C:\Test> ls
   目录: C:\Test
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2019/1/29     16:35              6 file

>>> import os
>>> os.rename(r'C:\Test\file',r'C:\Test\file2')  #重命名文件


PS C:\Test> ls
   目录: C:\Test
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2019/1/29     16:35              6 file2

>>> os.remove(r'C:\Test\file2')  #删除文件

PS C:\Test> ls  #此时因为file2已经被删除了,文件夹没有文件了,因此并没有ls出来结果


>>> os.getcwd()  #获取当前工作路径
'C:\\Users\\Administrator'
>>> os.chdir(r'C:\Test')  #改变工作目录
>>> os.getcwd()
'C:\\Test'

其他关于os模块的详细用法可以参考https://www.cnblogs.com/cherishry/p/5725977.html


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TeamsSix 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、文件简介
  • 二、文件的访问
  • 三、文件的使用
  • 四、文件的读取
  • 1、最基本的读取
  • 2、按需求读取
  • 五、文件的写入
  • 1、基本写入
  • 2、按列表内容写入
  • 3、在特定位置写入
  • 4、在最后写入
  • 六、文件的读写
  • 七、文件的访问 - b模式
  • 八、文件与其他类型 - 原生对象的存取
  • 九、文件操作中会用到的其它工具
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档