天天看点

第十一章

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)
           

继续阅读