zoukankan      html  css  js  c++  java
  • day4-Python-文件I/O

    一、打印到屏幕

    Python两种输出值的方式: 表达式语句和 print() 函数

    1、print语句,可以给它传递零或多个用逗号隔开的表达式。

    此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出。

    >>> print("我很漂亮,","yes?")
    我很漂亮, yes?
    

    2、str(): 函数返回一个用户易读的表达形式。repr(): 产生一个解释器易读的表达形式。

    >>> a='hello,world!'
    >>> str(a)
    'hello,world!'
    >>> repr(a)
    "'hello,world!'"
    >>> str(1/3)
    '0.3333333333333333'

    二、读取键盘输入

    input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘。

    input 可以接收一个Python表达式作为输入,并将运算结果返回。

    >>> str=input("请输入:")
    请输入:bianbian
    >>> print(str)
    bianbian 

    三、文件操作

    文件操作的流程:

    • 打开文件,得到文件句柄赋值给一个变量
    • 通过文件句柄,对文件进行操作
    • 关闭文件

    1、基本读取文件

    open() 将会返回一个 file 对象,基本语法格式如下: 

    open(filename, mode)
    • filename:包含了你要访问的文件名称的字符串值。
    • mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。 
    >>> f=open("/Users/bianbian/Desktop/cart.json","r")
    >>> data=f.read()
    >>> print(data)
    我叫便便
    my name is bianbian
    123456789
    abcdefg
    >>> f.close()
    

     注: f 叫文件句柄,它包含文件的文件名、文件的字符集、文件的大小、文件在硬盘上的起始位置

    >>> f=open("/Users/bianbian/Desktop/cart.json","r")
    >>> data=f.read()
    >>> data1=f.read()
    >>> print(data)
    我叫便便
    my name is bianbian
    123456789
    abcdefg
    >>> print(data1)  #data2的数据为空
    
    >>> 
    

    因为在文件中 ,维护一个类似文件指针的一个东西,这个文件指针类似于我们平时操作文件时的光标的东西,所以当第1次读文件时,文件指针已经指向最后一个位置,所以第2次再去读取的时候,是从最后一个位置开始读取的,所以读取的为空。 

    不同模式打开文件的完全列表:

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

    2、高效读取文件行

    readline() 读取一行文件

    >>> f=open("/Users/bianbian/Desktop/cart.json","r")
    >>> print(f.readline())
    我叫便便
    

    readlines()把文件中的每一行作为一个元素形成一个列表

    >>> print(f.readlines())
    ['my name is bianbian
    ', '123456789
    ', 'abcdefg']
    

    正常循环读取文件中的每一行 

    f=open("/Users/bianbian/Desktop/cart.json","r")
    for index,line in enumerate(f.readline()):
        if index == 2: #当下标值为2时,不打印
            print("----------------")
            continue
        print(line.strip())
    f.close()
    我
    叫
    ----------------
    便
    

     当读取的文件很大时,把几十个G的数据放到内存,内存肯定是受不了的,所以这种方法只适合小文件,不适合大文件。

    f=open("/Users/bianbian/Desktop/cart.json","r")
    count=0
    for line in f:
        if count == 3:
            print("----------------")
            count+=1
            continue
        print(line.strip())
        count+=1
    f.close()
    

     f文件变成迭代器,结果:

    我叫便便
    my name is bianbian
    123456789
    ----------------
    我叫便便
    my name is bianbian
    123456789
    abcdefg我叫便便
    my name is bianbian
    123456789
    abcdefg
    

    读取文件时,是一行一行的读取,而且,读取一行删除一行,内存中只保留一行。原因:f文件变成迭代器,它已经不再是一个列表的形式了,不能通过下标值来获取,需要一个计数器来计数。

    3、及时关闭文件

    为了避免打开文件后忘记关闭,可以通过管理上下文的方法。当with代码块执行完毕时,内部会自动关闭并释放文件资源。

    with open('log','r') as f:
    

    Python 3 ,with又支持同时对多个文件的上下文进行管理  

    with open('log1') as obj1, open('log2') as obj2:
    pass

    上面打开多个文件会导致一行代码过长,python官方建议,一行代码不超过80个字符,所以打开多个文件建议以下写法:

    with open('log1') as obj1, 
            open('log2') as obj2:
        pass
    

     4、文件修改

    修改文件:先读文件,一边读操作,再一边写,也就是说写需要命令一个新的文件,编写成功后,把老的文件删掉,把新文件重新命名成老文件。

    #读取老文件
    f=open("/Users/bianbian/Desktop/cart.json",'r',encoding="utf-8")
    #写入新文件
    f_new=open("/Users/bianbian/Desktop/cart_new.json",'w',encoding="utf-8")
    for line in f:
        #一边读老文件,修改内容
        if "我叫便便" in line:
            line = line.replace("我叫便便","便便很可爱")
            # 一边在新文件中写入
            f_new.write(line)
    f.close()
    f_new.close()

    修改前的文件:

    我叫便便

    my name is bianbian

    123456789

    abcdefg

    我叫便便

    my name is bianbian

    123456789

    abcdefg我叫便便

    my name is bianbian

    123456789

    abcdefg

    修改后的文件:

    便便很可爱

    便便很可爱

    abcdefg便便很可爱

      

      

     

  • 相关阅读:
    SQL Server 错误15401:没有找到Windows NT用户或组‘EMLE\ASPNET’
    使用 TestContext 类
    C# 动态2维数组
    2010年春季 软件测试技术 软件项目管理 实验安排
    代码覆盖率结果:没有为此测试运行启用代码覆盖率
    InternetGetCookie/InternetSetCookie (WinInet) changed with Internet Explorer 7
    C# 替换文本文件中的某一行 (要求此文件存在)
    android 复制 粘贴 功能实现
    java动态代理(JDK和cglib)
    使用ant打web应用更新包
  • 原文地址:https://www.cnblogs.com/bianfengjie/p/10738908.html
Copyright © 2011-2022 走看看