zoukankan      html  css  js  c++  java
  • python学习之文件操作

    4.3 文件操作

    4.3.1 初识

    语法:f = open('文件路径',mode='模式',encoding='编码')

    open:调用操作系统打开文件

    mode:对文件的操作方式;默认使用只读模式;b表示以字节的方式打开

    encoding:文件编码;以字节的方式打开文件时,可以不用加encoding

    ​ windows使用的是GBK,mac OS和nuix使用的是UTF-8;UTF-8是最常用的编码集

    f :文件句柄,给读取的文件一个标记,用于文件操作

    所有的操作公用一个光标,read命令执行按照光标所在文件位置往下进行,

    mode 描述 mode 描述
    r 只读 默认模式,文件不存在时报错 w 只写 不可读;文件不存在时则创建;文件存在时则清空内容
    r+ 读写 可读可写;先读后写 w+ 写读 可写可读,文件不存在时则创建;文件存在时先清空内容
    rb 只读 读取的数据类型是Bytes;在rb模式下,不能选择encoding字符 wb 只写 写入的数据类型是Bytes
    r+b 可读可写,数据类型是Bytes w+b 可读可写,数据类型是Bytes
    a 追加只写 w文件不存在时则创建;
    文件存在时则只追加内容
    a+ 追加写读 可写可读
    ab 追加可读 数据类型是Bytes a+b 数据类型是Bytes
    x 只写 不可读;文件不存在时则创建;<文件存在时则报错 x+ 写读 可写可读

    带b的模式是是打开非文本文件时使用的。

    4.3.2 只读操作r,rb

    r读文本文件,rb读取非文本文件

    f=open('D:mayungerencangkuday01ceshi.txt',mode='r',encoding='UTF-8')
    s = f.read()   #全部读取,按照字符读取;光标位于文件尾部
    s1 = f.readline() #读取一行
    print(s1,)  
    s2 = f.readlines()  #按行为以列表的形式输出
    print(s2)
    for i in f:  #迭代读取,该方式较为安全,能够防止内存溢出
        print(i)
    f.close()   #操作完之后,关闭文件
    
    
    tips:

    ​ .read() ---括号里不给数字是默认全读,全部读取时应防止文件过大造成内存溢出;如果()给出数字就表示读取相应的字符数,这里请注意,换行符占一个字符;

    ​ .readline() ---按行进行读取;添加参数,表示读取本行前几个字符

    ​ .readlines() ---按行进行全部输出,输出为列表

    ​ .close() ---把打开的文件关闭,良好的习惯

    ​ for循环读取能够防止内存溢出

    ​ 注意使用r,防止转义,如下例:

    f = open('C:/Users/lenovo/Pictures/Saved Pictures/timg.jpg',mode='rb',)
    
    f = open(r'C:UserslenovoPicturesSaved Pictures	img.jpg',mode='rb',)
    
    注意的问题:

    open()文件时:

    ​ 1.路径一定要正确,确保文件后缀正确;

    ​ 2.如果没有设置encoding的话,默认跟随系统走,Windows使用的是GBK,此时如果文件使用的是UTF-8,那么打开时会报错;

    ​ 3.带b模式打开文件时,不能指定encoding;

    4.3.3 写操作w,wb,a

    .write()

    ​ 在带w的模式下第一次执行write的时候,会先清空原来的内容,之后可正常write;

    ​ 如果没有该文件,则创建新的文件;

    ​ 在a模式下,不清空文件,为实在文件末尾进行添加

    .flush() 刷新输入管道,把内存中的文件刷到硬盘中,关闭文件前使用

    f = open('D:mayungerencangkuday01ceshi.txt',mode='a',encoding='UTF-8')
    f.write('hahaha')
    f.flush()  #刷新输入的管道
    f.close()  #关闭文件
    

    wb模式下,可以不指定打开⽂件的编码,但是在写⽂件的时候必须将字符串转化成utf-8的bytes数据

    f = open("小wa娃", mode="wb")
    f.write("金毛狮王".encode("utf-8"))
    

    文件拷贝

    用r模式打开一个文件,把内容读取写到一个用w模式打开的文件中

    f = open('C:/Users/lenovo/Pictures/Saved Pictures/timg.jpg',mode='rb',)  ##注意这里的文件路径使用的是unix方式
    f1 = open('d:/ceshi.jpg',mode='wb',)#内存使用率高
    f1.write(f.read())
    for line in f:  #这种方式比较安全,文件过大时,防止内存溢出
        f1.write(line)
    f.close()
    f1.flush()
    f1.close()
    

    4.3.4 文件路径

    1.绝对路径

    ​ 1.从此盘根目录寻找

    ​ 2.网络上的路径

    2.相对路径

    ​ 相对于当前程序所在的文件夹,去到其他的文件,实际应用较多,相对安全。

    import  os
    print(os.getcwd())  #查看绝对路径
    

    ​ ../去上一级文件夹

    f = open('../ceshi/ceshi.txt',mode='r',encoding='UTF-8')
    s = f.readline()
    print(s)  
    

    4.3.5 r+ w+ a+

    r+模式

    f = open('../ceshi/ceshi.txt',mode='r+',encoding='UTF-8')
    s = f.readline()
    f.write('jjzz')
    #s = f.readline()
    print(s)
    f.flush()
    f.close()
    

    注意大坑:在r+模式下,若果没有执行read操作,默认是从文件的开头进行write,把原来的内容覆盖;如果有read操作,把无论读了多少字符,write都会把内容写在文件的末尾。

    正确用法:先读再写

    w+模式

    ​ 用的很少,因为写入前要先清空文件

    正确用法:先写后读,读的时候配合f.seek()光标移动到开头进行查看

    a+模式

    4.3.6 操作方法

    1.光标

    r 模式下,光标默认在文件在最开头,每读一次,光标往后是动一次,单位是字符。

    w 模式下,因为要先清空文件内容,光标会停在文件开头

    a 模式下,追加模式,光标在文件末尾

    .tell()可以查看光标在哪里,tell的单位是字节

    .seek()的单位也是字节

    光标移动到末尾:seek(0,2),第一个参数:偏移量;第二个参 数:位置

    seek(偏移量,位置) 当前位置表示:0开头;1当前位置;2末尾

    2. 截断文件

    .truncate()把光标后边的内容删掉

    .truncate(12)给参数之后,截断到光标位置

    4.3.8 其他功能

    .fileno()返回文件句柄在内存中的索引值

    .flush()把文件从内存中强制刷到硬盘

    .readable()判断是否可读

    .writeable()判断文件是否可写

    4.3.9 with open()

    语法:with open ('文件路径',mode='模式',encoding='编码') as f

    with open ('111.txt',mode='r',encoding='utf-8')  as f ,
    open ('222.txt',mode='w',encoding='utf-8') as g :  
    	s = f.read
    	print(s)
    

    tips:打开多个文件时,代码较多可以在代码中间加一个 然后换行即可。

    with open ()面向对象中上下文管理

    使用的参数与open一致

    优势:

    ​ 能够自动关闭文件;

    ​ 能够同时打开操作多个文件;

    ​ 能够同时用r和w操作同一个文件;

    4.3.10 修改文件

    with open (路径,模式,encoding) as 变量名,open(路径,模式,encoding) as 变量名2:  
    import os
    for line in f1 :
    	new_line = line.replace('aa','bb')
    	f2.write(new_line)
    os.remove('文件名1')   
    os.rename('文件名2',‘文件名1)
    

    注意:实际应用时,不要轻易使用.remove ,我们可以对老文件进行rename进行重命名作为备份。

    仅供参考,欢迎指正
  • 相关阅读:
    MYSQL的基本语法
    如何实现SQL Server临时表的创建?
    计算时间 相加,相减 的方法,TimeSpan 数据转换
    sql server 拆分字符串,拆分两次(:和;)
    SQL group by分组查询(转)
    转: sqlserver常用sql语句,更改字段,建立唯一键,多个字段去重复等
    asp.net,CSS设置<TableListView>的title居左,居左,居上
    linq to sql ,将var 类型转为 IList 类型
    Open XML的上传、下载 、删除 ......文件路径
    C#操作office进行Excel图表创建,保存本地,word获取
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11032183.html
Copyright © 2011-2022 走看看