Python文件学习

打开文件
要打开文件,可使用函数 open ,它位于自动导入的模块 io 中。函数 open 将文件名作为唯一必不可少的参数,并返回一个文件对象。如果当前目录中有一个名为somefile.txt的文本文件(可能是使用文本编辑器创建的),则可像下面这样打开它:

>>> f = open('somefile.txt')

如果文件位于其他地方,可指定完整的路径。如果指定的文件不存在,将看到类似于下面的异常:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'somefile.txt'

文件模式
如果要通过写入文本来创建文件,这种调用函数 open 的方式并不能满足需求。为解决这种问题,可使用函数 open 的第二个参数。
调用函数 open 时,如果只指定文件名,将获得一个可读取的文件对象。如果要写入文件,必须通过指定模式来显式地指出这一点。函数 open 的参数 mode 的可能取值有多个,下表对此进行了总结。

'r'         读取模式(默认值)
'w'         写入模式
'x'         独占写入模式
'a'         附加模式
'b'         二进制模式(与其他模式结合使用)
't'         文本模式(默认值,与其他模式结合使用)
'+'         读写模式(与其他模式结合使用)

读取和写入(记得调用close()来关闭)
文件最重要的功能是提供和接收数据。如果有一个名为 f 的类似于文件的对象,可使用
f.write 来写入数据,还可使用 f.read 来读取数据。与Python的其他大多数功能一样,在哪些东西可用作数据方面,也存在一定的灵活性,但在文本和二进制模式下,基本上分别将 str 和 bytes 类用作数据。每当调用 f.write(string) 时,你提供的字符串都将写入到文件中既有内容的后面。

>>> f = open('somefile.txt', 'w')
>>> f.write('Hello, ')
7
>>> f.write('World!')
6
>>> f.close()

请注意,使用完文件后,我调用了方法 close ,这将在11.2.4节详细介绍。读取也一样简单,只需告诉流你要读取多少个字符(在二进制模式下是多少字节),如下例所示:

>>> f = open('somefile.txt', 'r')
>>> f.read(4)
'Hell'
>>> f.read()
'o, World!'

首先,指定了要读取多少(4)个字符。接下来,读取了文件中余下的全部内容(不指定要读取多少个字符)。请注意,调用 open 时,原本可以不指定模式,因为其默认值就是 ‘r’ 。

使用管道重定向输出(待理解)

pass

随机存取

在本章中,我将文件都视为流,只能按顺序从头到尾读取。实际上,可在文件中移动,
只访问感兴趣的部分(称为 随机存取)。为此,可使用文件对象的两个方法: seektell 。方法 seek(offset[, whence]) 将当前位置(执行读取或写入的位置)移到 offset 和whence 指定的地方。参数 offset 指定了字节(字符)数(从0开始),而参数 whence 默认为io.SEEK_SET( 0 ),这意味着偏移量是相对于文件开头的(偏移量不能为负数)。参数 whence 还可设置为 **io.SEEK_CUR ( 1 )**或 io.SEEK_END ( 2 ),其中前者表示相对于当前位置进行移动(偏移量可以为负),而后者表示相对于文件末尾进行移动。请看下面的示例:

tips:英文中一个字母是一字节。中国字比较复杂,1字节=8位。

1字节(byte)=8位(bit)

1024字节=1K

1024k=1M

>>> f = open(r'C:\text\somefile.txt', 'w')
>>> f.write('01234567890123456789')
20
>>> f.seek(5)
>>> f.write('Hello, World!')   #这里注意因为seek进行了移位没有默认参数所以重0开始,但写入的字符回替换掉原来的字符,如果没有替换完,后面还有会显示出来(如本例题),没有的话会在后面补上
13
>>> f.close()
>>> f = open(r'C:\text\somefile.txt')
>>> f.read()
'01234Hello, World!89  

方法 tell() 返回当前位于文件的什么位置,如下例所示:

>>> f = open(r'C:\text\somefile.txt')
>>> f.read(3)
'012'
>>> f.read(2)
'34'
>>> f.tell()
5

读取和写入行
实际上,本章前面所做的都不太实用。与其逐个读取流中的字符,不如成行地读取。要读取一行(从当前位置到下一个分行符的文本),可使用方法 readline 。调用这个方法时,可不提供任何参数(在这种情况下,将读取一行并返回它);也可提供一个非负整数,指定 readline 最多可读取多少个字符。因此,如果 some_file. readline() 返回的是 ‘Hello, World!\n’ ,那么some_file.readline(5) 返回的将是 ‘Hello’ 。要读取文件中的所有行,并以列表的方式返回它们,可使用方法 readlines 。方法 writelines 与 readlines 相反:接受一个字符串列表(实际上,可以是任何序列或可迭代对象),并将这些字符串都写入到文件(或流)中。请注意,写入时不会添加换行符,因此你必
须自行添加。另外,没有方法 writeline ,因为可以使用 write 。、

f = open(r'C:/Users/hanson/Desktop/1/somefile.txt')
print(f.readline())
f.seek(0)
print(f.readlines())

关闭文件
实际上,有一条专门为此设计的语句,那就是 with 语句。
with open(“somefile.txt”) as somefile:
do_something(somefile)
with 语句让你能够打开文件并将其赋给一个变量(这里是 somefile )。在语句体中,你将数据写入文件(还可能做其他事情)。到达该语句末尾时,将自动关闭文件,即便出现异常亦如此。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值