第十一章

11.1打开文件

要单纯的打开文件可使用open
例:f=open(‘something.txt’)
要写入文本来创建文件时可使用函数open第二个参数。
文件模式
函数open的参数mode的最常见取值。
‘r’读取模式(默认值)
‘w’写入模式 既有的内容将被删除,从文件开头出写入
‘x’独占写入模式 在文件存在的情况下引发FileExistsError异常
‘a’附加模式 在既有文件的末尾继续写入
‘b’二进制模式 与其他模式配合使用
‘t’文本模式 与其他模式配合使用
‘+’读写模式 可以与其他任何模式结合起来使用,表示即可读取也可写入
‘r+’与‘w+’后者截断文件

11.2文件的基本方法

11.2.1读取和写入

f=open ('soething.txt','w')
f.write('hello,')
f.write('world!')
f.close()
f=open('something.txt','r')
f.read()

11.2.2使用管道重定向输出
在bash和shell中,可依次输入多个命令,并使用管道将他们链接起来:
$cat somefile.txt | python somescript.py | sort
三个命令:
1.将文件somefile.txt的内容写入到标准输出
2.执行Python的脚本,这个脚本从标准输入中读取,并将结果写入到标准输出
3.读取标准输入的所有文件,并按首字母顺序将各行排序,将结果写入到标准输出。

import sys
text=sys.stdin.read()
words=text.split()
wordcount=len(words)
print('Wordcount:',wordcount)
#计算sys.stdin中包含多少个单词

随机存取:一般而言文件都是按顺序从头到尾随机的读取,也可以不按照顺序的读取,这样的方法称为随机存取。
示例:

f=open(r'C:\text\somefile.txt','w')
f.write('01234567890123456789')
20
f.seek(5)
5
f.write('hello,world!')
13
f.close()
f=open(r'C:\text\somefile.txt')
f.read()
'01234hello,world!89'
f.tell()
5

方法seek(offset[,whence])把当前位置移到offset和whence指定的地方,其中whence是默认值,offset指定字符数。
方法tell返回当前位于文件的位置。
11.2.3读取和写入行
读取一行:使用方法readline,可以不用提供参数,也可提供一个非负整数指定readline最多可以读取多少字符。readlines可以读取文件中的所有行,并以列表的方式返回他们。
writelines:接受一个字符串列表,并将这些字符串列表写入到文件中去,注意写入是不会添加换行符,需要自己添加。没有方法writeline,因为可以使用write。
11.2.4关闭文件
对于要读取文件的文件有必要要关掉,虽然不关掉没什么大的影响。
对于写入过得文件一定要关掉,当程序崩溃的时候,如不关闭,数据可能根本不会写入。
确保文件关闭:

#在这里打开文件
try:
     #将数据写入到文件中
finally:
     file.close()

with语句:

with open ('somefile.txt') as somefile:
        do_something(somefile)
        

with语句将打开的文件赋给变量,在语句体内将数据写入文件,到达该句的末尾的时候自动将文件关闭,即便出现异常,该操作依然执行。
with:上下文管理器,它支持两个方法对象,enter__和__exit
__enter__不接受任何参数,其返回值赋给as后面的变量。
__exit__接受三个参数,异常类型,异常对象,异常跟踪,即如果其返回值是Flase将会抑制所有的异常。

11.3迭代文件中的内容

11.3.1每次一个字符

#使用read遍历字符
with open (filename) as f:
     char =f.read(1)
     while char :
           process(char)
           char=f.read(1)
#以不同的方式来编写循环
with open (filename) as f:
    while True:
        char =f.read(1)
        if not char: break
        process(char)
#较上一个程序它避免了代码的重复

11.3.2每次一行

with open (filename) as f:
     while True:
          line=f.readline()
          if not line:break
          process(line)

11.3.3读取所有内容
在文件不太大情况下可一次读取整个文件,使用read将整个文件读入一个字符串中,使用方法readlines将一个文件读入到一个字符串列表中,其中每一行作为一个字符串。

#使用read迭代字符串
with open (filename) as f:
     for char in f.read():
         process(char)
         
with open (filename) as f:
     for line in f.readlines():
           process(line)
    

11.3.4使用fileinput实现延迟行迭代

import fileinput
for line in fileinput.input(filename):
      process(line)

11.3.5文件迭代器

with open (filename) as f:
      for line in f:
           process(line)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值