一、概述

我们工作中需要经常操作文件,下面就讲讲如何用Python操作文件

1、文件操作的流程:

  • 打开文件,得到文件句柄赋值给一个变量
  • 通过文件句柄,对文件进行操作
  • 关闭文件
    #获取文件句柄
    f = open("yesterday","r",encoding="utf-8")
    #读取数据
    data = f.read()
    #打印读取的文件
    print(data)
    #关闭文件
    f.close()

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

2、两次读取,第二次读取无内容解疑:

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

那怎么再重新读取数据呐?把光标移动到开始位即可

读取内容:

Somehow, it seems the love I knew was always the most destructive kind

Yesterday when I was young
f = open("yesterday2","r",encoding="utf-8")
#第1次读取
data = f.read()
#第2次读取
data2 = f.read()
print(data)
print("----------------data2-----%s----"%(data2))
f.close()
#输出结果
Somehow, it seems the love I knew was always the most destructive kind Yesterday when I was young ----------------data2---------

二、文件打开模式:

1、打开文件的模式有:

  注:在读取文件之前最好导入os模块,判断一下文件是否存在,这是一个好习惯

filename = r"C:\Users\dell\PycharmProjects\untitled\home_work\week4\haproxy"
if os.path.exists(filename):
#再进行获取文件句柄操作
  • r,英文:read,只读模式(默认)
  • w,英文:write,只写模式(不可读,不存在则创建新文件,存在则删除内容)
  • a,英文:append,追加模式(不可读,不存在则创建,存在则只追加内容)
f = open("yesterday","r",encoding="utf-8")
data = f.read()
print(date)
f.close()
#注:读操作,只能是只读,不能写和追加 ############################# f = open("yesterday2","w",encoding="utf-8")
f.write("qqqqqq")
f.close()
#注:写操作只能写和追加,不能读,而且写操作:
1、文件不存在,会重新创建一个文件,
2、文件存在,会覆盖之前的文件中的内容 ############################# f = open("yesterday2","a",encoding="utf-8")
f.read("aaaaaaaaaaaa")
f.close()
#注:追加模式不可读,不存在则创建,存在则只追加内容

2、"+"号表示同时读写某个文件:

  • r+,可读写文件(可读;可写;可追加)          
  • w+,可写读文件(可读,可写,创建新文件)
  • a+,可追加和读文件(可读,可追加,不存在则创建)
f = open("yesterday","r+",encoding="utf-8")
f.write("\n666666")
print(f.read())
f.close() #输出
Somehow, it seems the love I knew was always the most destructive kind
Yesterday when I was young
666666 ######################################### 写读的功能是:创建新文件->写入文本->设置指针为开始位置(seek(0))->读取到文件内容 f = open("yesterday2","w+",encoding="utf-8")
print(f.read())
f.write("qigao zui lang\n")
f.seek(0)
print(f.read())
print(f.tell())
f.write("qigao zui lang\n")
f.seek(0)
print(f.read()) #输出
#第1次读的内容 #第二次读取的内容
qigao zui lang #指针位置
16
#第三次读取的内容
qigao zui lang
qigao zui lang ####################################### 追加和读:追加读在写入文件时,不会清空之前的内容,而是在之前的内容的追加一行,读取文件内容,需要重新设置指针 f = open("yesterday2","a+",encoding="utf-8")
print("--------data1-----")
print(f.read()) #没有设置指针
print("--------data2-----")
f.seek(0)
print(f.read()) #设置指针
f.write("qigao zui lang\n")
print("---------data3----")
print(f.read()) #写完以后没有设置指针
print("--------data4-----")
f.seek(0)
print(f.read()) #写完以后设置指针
f.close() #输出 --------data1----- --------data2-----
And only now I'm left alone to end the play, yeah
qigao zui lang
qigao zui lang ---------data3---- --------data4-----
And only now I'm left alone to end the play, yeah
qigao zui lang
qigao zui lang
qigao zui lang

注:

1、写读和追加功能,写入的行数不会收指针位置的控制,就是说不管指针在什么位置,依然写入的还是最后一行。

2、就是说当你,需要从开始读取文件内容的话,或者在某个位置之后的内容的话,需要设置指针位置,否则读取不到内容,代码如下:

f = open("yesterday2","w+",encoding="utf-8")
f.write("qigao zui lang\n")
print("-----不设指针位置-----")
print(f.read())
f.write("qigao zui lang\n")
print("-----设置指针位置-------")
f.seek(0)
print(f.read()) #输出
-----不设指针位置----- -----设置指针位置-------
qigao zui lang
qigao zui lang

"U"表示在读取文件时,可以把\r\n自动转化为\n(与 r 或 r+ 模式同使用)

  • rU
  • r+U

3、"b"表示处理二进制文件

  • rb 二进制读
  • wb 二进制写
  • ab 二进制追加

这种是以二进制操作的,也就是说不管是是读,写,追加,都必须是二进制文件,也就是字节,而不是字符,需要解码以后才会生成字符。一般情况下跨平台的文件,视频文件等需要二进制模式 操作

#rb(二进制读)

#二进制读取
f = open("yesterday2","rb")
f_read = f.read()
print(f_read)
#解码
print(f_read.decode()) #输出
#没有解码,读出来的是二进制,也就是字节码
b'Somehow, it seems the love I knew was always the most destructive kind'
#解码后,是字符
Somehow, it seems the love I knew was always the most destructive kind ##################################### # wb(二进制写) f = open("yesterday2","wb")
in_str = "小高最帅" #这边写入文件,就需要编码,否则就会报错
in_str = in_str.encode() f.write(in_str)
f.close() #################################### # ab(二进制追加) f = open("yesterday2","ab")
in_str = "gaoge,shuai de yibi"
#这边需要先编码,才能追加到文件中
in_str = in_str.encode() f.write(in_str)
f.close()

注:普通打开模式和二进制打开模式,只是在python 3中,二进制打开模式才做了字符和字节的编码和解码;然而在python 2中,字节和字符没有做明显的区别,所以在python 2中,二进制模式读取文件时,不需要做编码和转码的操作

三、with、读取文件对比:

1、with:

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

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

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

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

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

2、读取文件对比:

readline()

读取一行文件

f = open("yesterday","r",encoding="utf-8")
print(f.readline())
f.close()
#输出
Somehow, it seems the love I knew was always the most destructive kind

readlines()

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

f = open("yesterday2","r",encoding="utf-8")
print(f.readlines())
f.close()
#输出
['Somehow, it seems the love I knew was always the most destructive kind\n','Yesterday when I was young\n']

我们正常循环读取文件中的每一行,如下:

f = open("yesterday2","r",encoding="utf-8")
for line in f.readlines():
print(line.strip())
f.close()
#输出
Somehow, it seems the love I knew was always the most destructive kind
Yesterday when I was young

这种方法已经达到我们的目的了,可以顺利的读取每一行,但是,当我们遇到2G,20G,甚至200G的文件时,你这样读取会导致内存不够用,会使程序变的很慢,因为你的内存只有几个G,你把几十个G的数据放到内存,内存肯定是受不了的,所以这种方法只适合小文件,不适合大文件。我们于是就有下面这种方法,如下:

f = open("yesterday2",'r',encoding='utf-8')
#f文件变成迭代器
for line in f:
print(line.strip())
f.close()
#输出结果
Somehow, it seems the love I knew was always the most destructive kind
Yesterday when I was young

这种写法的好处在于,读取文件时,是一行一行的读取,而且,读取一行删除一行,内存中只保留一行

四、文件操作的内置方法:

file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

【python】-- 文件操作的更多相关文章

  1. Python基础篇【第2篇】: Python文件操作

    Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...

  2. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  3. Python文件操作与函数目录

    文件操作 python文件操作 函数 Python函数学习——初步认识 Python函数学习——作用域与嵌套函数 Python函数学习——匿名函数 python内置函数 Python函数学习——递归 ...

  4. 初学Python——文件操作第二篇

    前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...

  5. day8.python文件操作

    打开和关闭文件 open函数 用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写. file = open(file_name [, access_ ...

  6. 关于python 文件操作os.fdopen(), os.close(), tempfile.mkstemp()

    嗯.最近在弄的东西也跟这个有关系,由于c基础渣渣.现在基本上都忘记得差不多的情况下,是需要花点功夫才能弄明白. 每个语言都有相关的文件操作. 今天在flask 的例子里看到这样一句话.拉开了文件操作折 ...

  7. Python之路Python文件操作

    Python之路Python文件操作 一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r&qu ...

  8. python 文件操作 r w a

    python基础-文件操作   一.文件操作 对文件操作的流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件       打开文件时,需要指定文件路径和以何等方式打开文件, ...

  9. Python:文件操作技巧(File operation)(转)

    Python:文件操作技巧(File operation) 读写文件 # ! /usr/bin/python #  -*- coding: utf8 -*- spath = " D:/dow ...

  10. 小学生都能学会的python(文件操作)

    小学生都能学会的python(文件操作) 1. open("文件路径", mode="模式", encoding="编码") 文件的路径: ...

随机推荐

  1. CentOS 7.2通过yum安装zabbix

    环境说明 系统版本    CentOS 7.2 x86_64 软件版本    yum安装zabbix 3.0.18 首先准备一台纯净的CentOS 7.2系统 1.配置zabbix源 [root@za ...

  2. jquery load方式浏览器断点调试

    jquery load的方式引入的,如果需要在浏览器中断点调试,需要在代码中使用debugger进行断点

  3. LeetCode-Minimum Window Substring -- 窗口问题

    题目描述 Given a string S and a string T, find the minimum window in S which will contain all the charac ...

  4. Eclipse 使用 SVN 插件后改动用户方法汇总

    判定 SVN 插件是哪个 JavaH 的处理方法 SVNKit 的处理方法 工具自带改动功能 删除缓存的秘钥文件 其他发表地点 判定 SVN 插件是哪个 常见的 Eclipse SVN 插件我知道的一 ...

  5. windows超过最大连接数解决命令

    query user /server:218.57.146.175 logoff  1 /server:218.57.146.175

  6. Mysql 创建权限较小的用户(只对特定数据库有操作权限)

    项目开发过程中,因为root的权限太大,可能对其他数据库造成修改.故创建一权限较小的用户,使其只能对特定的数据库操作,以保证数据安全. 主要语句如下: grant all on bos19.* to ...

  7. javax.mail Java Extension(扩展)

    http://baike.baidu.com/view/616724.htm JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便 ...

  8. 点击tablecell中的一个按钮,确定cell所在的行

    - (void) del:(UIButton *) button { NSLog(@"%s",__FUNCTION__); UITableViewCell * cell = (UI ...

  9. SVN版本控制图标未显示或显示异常

    TortoiseSVN下载的文件和文件夹如果缺失了那些花花绿绿的状态小图标,很容易逼死某些强迫症患者,更何况这些小图标用处多多 接下来我会逐步展示从常规到非常规的一系列解决方案(不包括重装重启这一类) ...

  10. iOS GCD倒计时

    GCD倒计时的好处在于不用考虑是否定时器无法释放的问题,runloop的问题,还有精度更加高 使用GCD创建定时器方法 -(void)startCountDown:(NSInteger)maxTime ...