zoukankan      html  css  js  c++  java
  • 初学Python——文件操作

    一、文件的打开和关闭

    1.常用的打开关闭语句

    f=open("yesterday","r",encoding="utf-8")   #打开文件
    f,close()   #关闭文件

    第一行是打开名为“yesterday”的文件,只读属性,编码方式为utf-8。如果没有指定文件打开方式,默认只读“r”,如果没有指定编码方式可能会部分乱码。

    第二行是关闭文件

    2.with as语句

    目的:为了防止程序员打开文件后忘记关闭文件

    with open("yesterday","r",encoding="utf-8") as f:
        <代码段>

    3.文件打开方式

    打开方式 是否可读 是否可写 是否可创建 是否会覆盖 特点 建议
    r 只读,安全 推荐
    r+ 追加 有时部分覆盖 容易写入出错 不建议
    w 全覆盖 只写 谨慎
    w+ 全覆盖

    只写

    打开文件即清空

    不建议

    数据非常不安全

    a 追加 追加不覆盖 推荐
    a+ 追加 全能且安全 推荐

    说明一下:

    (1)r:如果只有读取数据的需求,建议用这种,杜绝了对数据破坏的可能。

    (2)r+:之所以不推荐它是因为,写入数据的行为难以捉摸,并且可能会因此破坏数据,造成损失。如果不是十分清楚它的习性,不要用它。

    写入方式:有时覆盖,有时追加。

    当写入操作前一步是读取的时候,这时候不会覆盖数据,在最后追加:

    f=open("yesterday3","r+",encoding="utf-8")
    print(f.readline())  #读取一行数据
    f.write("nihao")     #写入数据
    f.close()

    执行前的文件:

    执行后的文件:

    当写入操作前一步不是读取的时候,覆盖写入数据,从光标处开始覆盖部分数据:

    f=open("yesterday3","r+",encoding="utf-8")
    print(f.tell())          #获取光标当前位置
    f.write("nihao")    #写入数据
    f.close()

    执行后:

    所以,尽量不要用它

    (3)w:只能写入数据,并且覆盖之前的全部数据。由于会对之前数据造成丢失,所以使用它时要谨慎。可创建的意思是如果指定打开的文件不存在,则创建一个文件。

    (4)w+:不建议此种方式。每次打开文件都会对数据进行清空,即使不进行任何操作。可以这样理解:每次打开时,都会重新创建一个同名文件并覆盖,初始情况下当然是空的。可读可写可创建。

    (5)a:可追加,可创建。保证了数据的安全,不会覆盖之前的数据

    (6)a+:全能型选手,啥活都能干,而且数据安全,不会覆盖。但是有个特点,文件打开时光标起始位置在最后面,所以导致读取不到数据。(其他方式打开文件时,光标都在开头位置)

    来测试一下:

    f=open("yesterday3","a+",encoding="utf-8")
    print(f.tell())           #获取光标当前位置
    print(f.readline())   #读取一行数据
    f.close()

    运行结果:

    当前光标位置327(字符),没有读取到数据。怎么办?将光标移动到开头就好了

    f.seek(0)  #将光标移动到开头位置

    顺利运行:

    4. f  是什么?

    f 叫做文件句柄。是文件的内存对象,包含文件的大小、文件名、硬盘中的起始位置等信息封装成了一个句柄。

    二、文件的写和读

    1.写

    f.write("123
    ") 

    写入数据时,只能以字符形式,如果是int会出错,并且换行符“ ”也占有相应的字符。

    2.读

    注意:任何时候进行读取操作,都要看清楚当前光标的位置,才能读到想要的数据。

    ①将所有数据一次性全部读出来(一般不用,不适合读取大文件)

    data=f.read() #data是一个字符串变量
    print(data)
    
    print(f.read())    #如果这三行代码放到一起,会发现第三行代码读不出来数据,而且也没有报错,实际上是没有注意光标的位置,
    要解决很简单,只要将光标移动到初始位置就好了

    ②只读取有限个字符

    print(f.read(5)) #从光标处开始只读取5个字符

    ③读取一行数据

    print(f.readline())  #从光标处开始读取一行数据

    ④readlines()

    也是读取全部数据,但有所不同

    a=f.readlines() 

    a是一个列表,文件中每一行数据都转化成列表的元素。

    ⑤循环读取数据

    for i in range:
       print(i)

    一行一行地读取数据,读完整个文件。推荐用这种方式,内存中始终只保存一行的数据,可以读大文件。

    三、其他常用操作

    1.查看当前光标位置

    print(f.tell())

    2.移动光标位置

    f.seek(0)    #将光标位置移动到开头
    f.seek(10)  #移动到第10个字符的位置

    3.打印文件的编码

    print(f.encoding)

    4.判断光标是否可以移动

    print(f.seekable())

    在linux系统一切皆文件,终端设备文件不能移动光标

    5.强制刷新

    print(f.flush())

    功能是,强制、立即将在此之前写入的数据写入到硬盘中。

    在计算机中,往硬盘里写入数据通常不是当即发生的,写入(保存)后,操作系统会给人反馈说,已经将数据存了进去,但实际并没有立即写入,而是现将其存入系统缓存中,等到操作系统认为合适的时候再一次性写入进去。至于为什么这么做,我掌握到的有两点原因:一是提高系统运作效率,由于硬盘读写速度慢,整个程序会因为这个操作变得很慢,卡在这里,整个系统的运作效率很低;二是保护硬盘,用户可以很频繁地执行写入操作,如果硬盘也这么做(跟用户同步),硬盘寿命会大大降低。

    所以,flush()方法的作用是立刻刷新硬盘的数据,将之前写入的数据立刻写入硬盘中。

    6.判断文件是否关闭

    当同时打开的文件很多时,可能不太清楚哪些文件关闭了,哪些文件没有关,可以用closed()方法检测一下

    print(f.closed())

    7.清除文件数据

    f.truncate(10)

    除了前10个字符,清空文件所有数据(文件打开方式不可以是“r”,最好是“a”)

    清除操作跟当前光标位置无关。如果括号内不写数据,清空所有数据。

    四、二进制文件

    打开方式:“rb”(只读),“wb”(只写),“ra”(追加)

    什么时候会用到二进制打开方式呢?

    1.网络传输只能用二进制(至少在Python3.0)

    2.操作二进制文件(如果用字符形式可能会出错)

    五、文件修改

    上面讲了文件的读写等操作,但是写不能等同于改,写只能覆盖或者追加,有什么方法呢?

    一般有两种方法:1.将文件数据全部加载到内存里,针对内存里的数据进行修改,然后再写入

    2.打开文件,一行一行地读入,修改完后写入新的文件。(循环执行从旧文件读一行,在新文件写一行的操作)

    这里推荐第2种方法,不推荐第一种。因为计算机的内存是有限的,第一种方法不合适处理大文件,而第二种不仅合适大文件也保证了数据的安全。

    f1=open("yesterday2","r",encoding="utf-8")    #打开旧文件
    f2=open("yesterday3","w",encoding="utf-8")    #打开新文件
    oldword=input("请输入待修改的内容:")
    newword=input("请输入修改后的内容:")
    for line in f1:  #迭代器循环
        if oldword in line:    #如果找到了待修改的内容
            line=line.replace(oldword,newword)   #字符串替换操作
            print("修改成功!")
        f2.write(line)         #无论是否修改了内容,都将其写入新的文件中
    
    f2.close()       #关闭新文件
    f1.close()                      #关闭旧文件
  • 相关阅读:
    HashPasswordForStoringInConfigFile中的Md5算法并非常用的Md5算法
    (转)C#实现MD5加密
    pb将datawindow数据导出EXCEL
    (转)笔记320 SQLSERVER中的加密函数 2013-7-11
    Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
    PowerDesigner中Name与Code同步的问题
    (转) PowerDesigner中Table视图同时显示Code和Name
    SQLServer2012在登录远程服务器实例时报错:尝试读取或写入受保护的内存
    PB代码动态解析执行器
    XenServer安全重启xapi的方法
  • 原文地址:https://www.cnblogs.com/V587Chinese/p/8799277.html
Copyright © 2011-2022 走看看