• 文件


    文件
    1、打开文件
    要打开文件,可使用函数open,它位于自动导入的模块io中。函数open将文件名作为唯一必不可少的参数,并返回一个文件对象。若文件位于其它地方,可指定完整的路径。
    >>>f = open("filename.txt")
    >>>f = open("/path/to/somewhere/filename.txt")
    若要通过写入文本来创建文件,则需要函数open的第二个参数。
    文件模式
    调用函数open时,如果只指定文件名,将获得一个可读取的对象。如果要写入文件,必须通过指定模式来显式的指出。函数open的参数mode的取值可能有多个。
    r ---读取模式(默认模式)
    w ---写入模式
    x ---独占写入模式
    a ---附加模式
    b ---二进制模式(与其它模式结合使用)
    t ---文本模式(默认值,与其它模式结合使用)
    + ---读写模式(与其它模式结合使用)
    说明:
    显式的指定读取模式的效果与跟本不指定模式相同;
    写入模式能够写入文件,并在文件不存在时创建它;
    独占写入模式更进一步,在文件已经存在时引发FileExistsError异常;
    在写入模式下打开文件时,既有内容将被删除(截断),并从文件开头处开始写入;
    如果要在既有文件末尾继续写入,可使用附加模式;
    "+"可与其它任何模式结合使用,表示既可读取也可写入。如要打开一个文本文件进行读写,可使用"r+"。("r+"和"w+"的区别:后者截断文件,而前者不会)
    默认模式为"rt",这意味着将把文件视为经过编码的unicode文本,因此将自动进行编码和解码,且默认使用UTF-8编码。
    要指定其它编码和Unicode错误处理策略,可使用关键字参数encoding和errors。这还将自动转换换行字符。默认情况下,行以" "结尾。读取时将自动替换其它行尾字符(" "或" ");写入时将" "替换为系统的默认行尾字符(os.linesep)
    python使用通用换行模式。在这种模式下,readlines等方法能够识别所有合法的换行符(" "、" "和" ")。如果要使用这种模式,同时禁止自动转换,可将关键字参数newline设置为空字符串,如open(name,newlin='')
    如果文件包含非文本的二进制数据,如音频或图像,肯定不希望执行自动转换,为此,可使用二进制模式(如"rb")来禁止与文本相关的功能。
    2、文件的基本方法
    文件对象的一些基本方法以及其他类似于文件的对象(有时也称为流)。类似于文件的对象支持文件对象的一些方法,如支持read或write。
    三个标准流:
    一个标准数据输入源是sys.stdin:当程序从标准输入读取时,可以通过输入来提供文本,也可使用管道将标准输入流关联到其它程序的标准输出
    提供给print的文本出现在sys.stdout中,向input提供的提示信息也出现在这里。写入到sys.stdout的数据通常出现在屏幕上,也可使用管道将其重定向到另一个程序的标准输入。
    错误消息(如栈跟踪)被写入到sys.stderr,但与写入到sys.stdout的内容一样,可对其进行重定向。
    读取和写入
    若有个名为f的类似于文件的对象,可使用f.write来写入数据,f.read来读取数据。在文本和二进制模式下,基本上分别将str和bytes类用作数据。
    >>>f = open("filename.txt")
    >>>f.write("hello,")
    6
    >>>f.write("world")
    11
    >>>f.close()
    注:使用完文件后,调用了方法close
    >>>>f = open("filename.txt","r")
    >>>f.read(4) --->'hell'
    >>>f.read() --->'o,world!.....'
    注:首先指定了要读取多少个(4)字符,接下来读取了文件余下的全部内容(不指定要读取多少个字符)。
    若在二进制模式下是读取多少字节。
    调用函数open时,可以不指定模式,因为其默认值就是"r"
    使用管道重定向输出:
    随机存取
    读取文件中的任意部分:可以使用文件对象的两个方法:seektell
    seek(offset9,whence):将当前位置(执行读取或写入的位置)移到offset和whence指定的地方。参数offset指定了字节(字符)数,而参数whence默认为io.SEEK_SET(0),这意味着偏移量是相对于文件开头的(此时偏移量不能为负数)。参数whence还可设置为io.SEEK_CUR(1)或io.SEEK_END(2),其中前者表示相对于当前位置进行移到(偏移量可以为负),而后者表示相对于文件末尾进行移动。
    >>>f = open(r'C:UsersAdministratorDesktop est.txt',"w")
    >>>f.write("0123456789abcdefghij")
    20
    >>>f.seek(5)
    5
    >>>f.write("hello,world")
    11
    >>>f.close()
    >>>f = open(r'C:UsersAdministratorDesktop est.txt')
    >>>f.read() --->'01234hello,worldghij'
    方法tell()返回当前位于文件的什么位置:
    >>>>f = open(r'C:UsersAdministratorDesktop est.txt')
    >>>f.read(3) --->'012'
    >>>f.read(2) --->'34'
    >>>f.tell() --->'5'
    读取行和写入行:
    成行的读取:可以使用方法readline。调用这个方法时,可以不提供任何参数(该情况下,将读取一行并返回它);也可提供一个非负整数,指定readline最多可读取多少个字符。
    >>>f = open(r'C:UsersAdministratorDesktop est.txt')
    >>>f.readline()
    要读取文件中的所有的行,并以列表的方式返回,可使用方法readliness
    方法writeliness与readliness相反:接受一个字符串列表(也可是任何序列或可迭代对象),并将这些字符串都写入到文件(或流)中。写入时不会添加换行符,因此需自行添加。另没有方法writeline,因为可使用write。
    关闭文件:
    关闭文件:调用方法close。通常程序退出时将自动关闭文件对象。
    对于写入过的文件,一定要将其关闭,因为Python可能会缓冲写入的数据。若程序因某种原因崩溃,数据可能根本不会写入到文件中。
    如果要重置缓冲,让所做的修改反映到磁盘中,但又不想关闭文件,可使用方法flush(然flush可能出于锁定考而禁止其它正在运行的程序访问这个文件)。
    要确保文件得以关闭,可使用一条try/finally语句,并在finally子句中调用close。
    #打开某文件
    try:
    #将数据写入到文件中
    finally:
    file.close()
    另:有一条专门为此设计的语句:with语句
    with open("somefile.txt") as somefile
    do_something(somefile)
    with语句能够打开文件并将其赋给一个变量(此处是somefile)。到达语句末尾时,将自动关闭文件,即便出现异常亦是如此。
    示例:有一文本内容为:
    this is first line
    this is second line
    this is three line
    read(n)的使用:
    >>>f = open(r'C:UsersAdministratorDesktop est.txt')
    >>>f.read(7) --->'this is fi'
    >>>f.read(5) --->'rst l'
    >>>f.close()
    read()的使用:
    >>>f = open(r'C:UsersAdministratorDesktop est.txt')
    >>>print(f.read())
    this is first line
    this is second line
    this is three line
    >>>f.close()
    readline()的使用:
    >>>f = open(r'C:UsersAdministratorDesktop est.txt')
    >>>for i in range(3):
    print(str(i) + ":" + f.readline(),end="")
    0:this is first line
    1:this is second line
    2:this is three line
    >>>f.close()
    readlines()的使用:
    >>>import pprint
    >>>pprint.pprint(open(r'C:UsersAdministratorDesktop est.txt').readlines())
    ['this is first line ',
    'this is second line ',
    'this is three line ']
    注:此处利用了文件对象将被自动关闭。
    write(string)的使用:
    >>>f = open(r'C:UsersAdministratorDesktop est.txt',"w")
    >>>f.write("there is no market")
    >>>f.close()
    文件文本内容将变为:
    there
    is no
    market
    writelines(list)的使用:
    >>>f = open(r'C:UsersAdministratorDesktop est.txt')
    >>>lines=f.readlines()
    >>>f.close()
    >>>lines[1] = "isn't a "
    >>> lines --->['there ', "isn't a ", 'market']
    >>>f = open(r'C:UsersAdministratorDesktop est.txt',"w")
    >>>f.writelines(lines)
    >>>f.close()
    文件文本内容将变为:
    there
    isn't a
    market
    3、迭代文件内容
    对每个字符或行所做的处理
    def process(string)
    print("Processing: ",string)
    每次一个字符/字节:
    使用read遍历字符:
    with open(filename) as f:
    char = f.read(1)
    while char:
    process(char)
    char = f.read(1)
    注:在文件末尾时,方法read将返回一个空字符串,即结束循环。在此之前,char都只包含一个字符,对应的布尔值为True。
    with open(filename) as f:
    while True:
    char = f.read(1)
    if not char:break
    process(char)
    每次一行:
    在while循环中使用readline
    with open(filename) as f:
    while True:
    line = f.readline(1)
    if not line:break
    process(line)
    读取所有的内容:
    一次读取整个文件:可使用方法read并不提供任何参数(将整个文件读取到一个字符串中),或使用方法readlines(将文件读取到一个字符串列表中,其中每个字符串都是一行)
    使用read迭代字符:
    with open(filename) as f:
    for char in f.read():
    process(char)
    使用readlines迭代行:
    with open(filename) as f:
    for line in f.read():
    process(line)
    fileinput实现延迟行迭代:
    迭代大型文件中的行,使用readlines将占大量内存。也可结合使用while和readline,在python中,应首选for循环。另可使用一种延迟行迭代的方法--只读取实际需要的文本部分。
    使用fileinput迭代行:
    import fileinput
    for line in fileinput.input(filename)
    process(line)
    文件迭代器
    文件实际上也是可迭代的,可在for循环中直接使用它们来迭代行。
    with open(filename) as f:
    for line in f:
    process(line)
    在不给文件对象赋值给变量的情况下迭代文件:
    for line in open(filename)
    process(line)
    要迭代标准输入sys.stdin中的所有行:
    import sys
    for line in sys.stdin:
    process(line)
    对文件:如使用list(open(filename))将其转换为字符串列表,其效果与使用readlines相同
    >>>f = open("somefile","w")
    >>>print("first","line",file=f)
    >>>print("second","line",file=f)
    >>>print("third","and final","line",file=f)
    >>>f.close()
    >>>lines=list(open("somefile"))
    >>>lines --->['first line ', 'second line ', 'third and final line ']
    >>>first,second,third = open("somefile")
    >>>first --->'first line '
    >>>second ---> 'second line '
    >>>third --->'third and final line '
    注:使用了print来写入文件,这将自动在提供的字符串后面添加换行符
    对打开的文件进行序列解包,从而将每行存储到不同的变量中
  • 相关阅读:
    高性能异步爬虫
    线程池在爬虫案例中的应用
    线程池的基本使用
    requests代理爬取
    python验证码识别
    获取人人网当前用户的个人详情页数据
    模拟登录人人网
    移远BC26基础开发之程序结构 三
    移远BC26基础开发之配置 二
    移远BC26/BC28(略)/MC20开发之环境搭建 一
  • 原文地址:https://www.cnblogs.com/skyzy/p/9432969.html
Copyright © 2020-2023  润新知