一、概述

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

1、文件操作的流程:

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

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

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

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

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

读取内容:

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

二、文件打开模式:

1、打开文件的模式有:

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

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

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

  • r+,可读写文件(可读;可写;可追加)          
  • w+,可写读文件(可读,可写,创建新文件)
  • a+,可追加和读文件(可读,可追加,不存在则创建)
  1. f = open("yesterday","r+",encoding="utf-8")
  2. f.write("\n666666")
  3. print(f.read())
  4. f.close()
  5.  
  6. #输出
  7. Somehow, it seems the love I knew was always the most destructive kind
  8. Yesterday when I was young
  9. 666666
  10.  
  11. #########################################
  12.  
  13. 写读的功能是:创建新文件->写入文本->设置指针为开始位置(seek(0))->读取到文件内容
  14.  
  15. f = open("yesterday2","w+",encoding="utf-8")
  16. print(f.read())
  17. f.write("qigao zui lang\n")
  18. f.seek(0)
  19. print(f.read())
  20. print(f.tell())
  21. f.write("qigao zui lang\n")
  22. f.seek(0)
  23. print(f.read())
  24.  
  25. #输出
  26. #第1次读的内容
  27.  
  28. #第二次读取的内容
  29. qigao zui lang
  30.  
  31. #指针位置
  32. 16
  33. #第三次读取的内容
  34. qigao zui lang
  35. qigao zui lang
  36.  
  37. #######################################
  38.  
  39. 追加和读:追加读在写入文件时,不会清空之前的内容,而是在之前的内容的追加一行,读取文件内容,需要重新设置指针
  40.  
  41. f = open("yesterday2","a+",encoding="utf-8")
  42. print("--------data1-----")
  43. print(f.read()) #没有设置指针
  44. print("--------data2-----")
  45. f.seek(0)
  46. print(f.read()) #设置指针
  47. f.write("qigao zui lang\n")
  48. print("---------data3----")
  49. print(f.read()) #写完以后没有设置指针
  50. print("--------data4-----")
  51. f.seek(0)
  52. print(f.read()) #写完以后设置指针
  53. f.close()
  54.  
  55. #输出
  56.  
  57. --------data1-----
  58.  
  59. --------data2-----
  60. And only now I'm left alone to end the play, yeah
  61. qigao zui lang
  62. qigao zui lang
  63.  
  64. ---------data3----
  65.  
  66. --------data4-----
  67. And only now I'm left alone to end the play, yeah
  68. qigao zui lang
  69. qigao zui lang
  70. qigao zui lang

注:

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

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

  1. f = open("yesterday2","w+",encoding="utf-8")
  2. f.write("qigao zui lang\n")
  3. print("-----不设指针位置-----")
  4. print(f.read())
  5. f.write("qigao zui lang\n")
  6. print("-----设置指针位置-------")
  7. f.seek(0)
  8. print(f.read())
  9.  
  10. #输出
  11. -----不设指针位置-----
  12.  
  13. -----设置指针位置-------
  14. qigao zui lang
  15. qigao zui lang

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

  • rU
  • r+U

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

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

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

  1. #rb(二进制读)
  2.  
  3. #二进制读取
  4. f = open("yesterday2","rb")
  5. f_read = f.read()
  6. print(f_read)
  7. #解码
  8. print(f_read.decode())
  9.  
  10. #输出
  11. #没有解码,读出来的是二进制,也就是字节码
  12. b'Somehow, it seems the love I knew was always the most destructive kind'
  13. #解码后,是字符
  14. Somehow, it seems the love I knew was always the most destructive kind
  15.  
  16. #####################################
  17.  
  18. # wb(二进制写)
  19.  
  20. f = open("yesterday2","wb")
  21. in_str = "小高最帅"
  22.  
  23. #这边写入文件,就需要编码,否则就会报错
  24. in_str = in_str.encode()
  25.  
  26. f.write(in_str)
  27. f.close()
  28.  
  29. ####################################
  30.  
  31. # ab(二进制追加)
  32.  
  33. f = open("yesterday2","ab")
  34. in_str = "gaoge,shuai de yibi"
  35. #这边需要先编码,才能追加到文件中
  36. in_str = in_str.encode()
  37.  
  38. f.write(in_str)
  39. f.close()

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

三、with、读取文件对比:

1、with:

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

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

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

  1. #with open('log1') as obj1, open('log2') as obj2:
  2.  
  3. with open('log1') as obj1, \
  4. open('log2') as obj2:
  5. pass

2、读取文件对比:

readline()

读取一行文件

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

readlines()

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

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

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

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

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

  1. f = open("yesterday2",'r',encoding='utf-8')
  2. #f文件变成迭代器
  3. for line in f:
  4. print(line.strip())
  5. f.close()
  6. #输出结果
  7. Somehow, it seems the love I knew was always the most destructive kind
  8. 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. 初识Nginx及编译安装Nginx

    初识Nginx及编译安装Nginx 环境说明: 系统版本    CentOS 6.9 x86_64 软件版本    nginx-1.12.2 1.什么是Nginx? 如果你听说或使用过Apache软件 ...

  2. shopex下二级目录wordpress伪静态规则写法_SEO教程

    实这几天做服务器,做商城学到很多知识,只是太忙了没有空记录下来分享. 今天 商城的内容基本已经做好了.在shopex的二级目录下又建了一个wordpress来做SEO优化. 在wordpress后台做 ...

  3. elasticsearch 基础性操作

    1 基础概念 Elasticsearch是一个近实时的系统,从你写入数据到数据可以被检索到,一般会有1秒钟的延时.Elasticsearch是基于Lucene的,Lucene的读写是两个分开的句柄,往 ...

  4. Android源代码下载

    清华大学AOSP镜像: https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

  5. CocoaPods安装及相关命令

    具体安装参考: http://www.jianshu.com/p/dfe970588f95 http://www.jianshu.com/p/9e4e36ba8574 我就说一个,安装cocoapod ...

  6. java8 lambda 与 stream

    参见:https://www.bilibili.com/video/av14372754/?p=2

  7. c# 获取毫秒值,时间戳

    获取时间戳(秒) (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000 获取时间戳(毫秒) (DateTime. ...

  8. 借助Anyproxy实时监控接口调用次数和流量

    监控接口调用次数,是为了测试客户端可能会异常频繁的调用服务端接口,出现性能问题. AnyProxy是一个开放式的HTTP代理服务器. github: https://github.com/alibab ...

  9. 清华EMBA课程系列思考之三 -- 中国经济与金融

    清华EMBA的第三次课,大家都已经渐渐了解了课程系列的基本节奏,也逐步适应了思考的基本思路,本次课程涉及到的全部内容都非常专业.闲话少述,直入主题了. 李稻葵教授部分: -- 清华大学经济管理学院弗里 ...

  10. es6/es7 对象数组的合并拷贝

    方法一: let o1 = { a: 1, b: 2, c: 3 }; let o2 = {...o1, d: 4}; // o2 = { a: 1, b: 2, c: 3, d: 4 } let a ...