打开文件的两种方式

1.直接打开文件并赋值给变量,打开后得到操作句柄,但不会自动关闭

  • file = open('文件名‘,'打开模式',’编码‘)
  • fd = open('../config/file1.txt','r',encoding='utf-8')

2.使用with子句,打开后文件会自动关闭,建议使用,并可以同时打开多个文件

with open('../config/file1.txt','r',encoding='utf-8') as fd1,\
open('../config/file2.txt','r',encoding='utf-8') as fd2:
print("I had open two files")

打开文件的8种模式

    ========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newline mode (deprecated)
========= ===============================================================

1.’r',默认模式,参数可以不写,打开只读文件,写入报错

>>> fd = open('../config/file1.txt','r',encoding='utf-8')
>>> fd.write('java c rubby')
Traceback (most recent call last):
File "<stdin>", line , in <module>
io.UnsupportedOperation: not writable

2.‘w’,先truncate原文件,后写入,不可读,文件不存在则创建

>>> fd = open('../config/file1.txt','w',encoding='utf-8')
>>> print(fd.read())
Traceback (most recent call last):
File "<stdin>", line , in <module>
io.UnsupportedOperation: not readable
>>> fd.write('java rubby go') >>> fd.close()
>>> fd = open('../config/file1.txt','r',encoding='utf-8')
>>> fd.read()
'java rubby go'

3.'x',创建新文件,打开并写入,如果文件已经存在,则报错

>>> fd = open('../config/file21.txt','x',encoding='utf-8' )
>>> fd.read()
Traceback (most recent call last):
File "<stdin>", line , in <module>
io.UnsupportedOperation: not readable
>>> fd.write('') >>> fd.close()
>>> fd = open('../config/file21.txt','r',encoding='utf-8')
>>> fd.read()
''
>>> fd.close()
>>> fd = open('../config/file21.txt','x',encoding='utf-8')
Traceback (most recent call last):
File "<stdin>", line , in <module>
FileExistsError: [Errno ] File exists: '../config/file21.txt'

4.’a',追加写内容到文件末尾

>>> fd = open('../config/file1.txt','a',encoding='utf-8')
>>> fd.write('linux windows aix')
17
>>> fd.close()
>>> fd = open('../config/file1.txt','r',encoding='utf-8')
>>> fd.read()
'java rubby golinux windows aix'

5.'b',二进制模式,比如流文件mp3,并且需要同时指定一种读写模式

>>> fd = open('/tmp/Front_Right.wav','b')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Must have exactly one of create/read/write/append mode and at most one plus
>>> fd = open('/tmp/Front_Right.wav','rb')
>>> fd1 = open('/tmp/Front_Right.wav','wb')
>>> fd2 = open('/tmp/Front_Right.wav','ab')
>>> fd2 = open('/tmp/Front_Right.wav','w+b')
>>> fd2 = open('/tmp/Front_Right.wav','r+b')

6.'t',文本模式,默认打开文本并读取模式rt

7.'+',打开硬盘文件读写

  • r+,打开并写入
  • >>> fd = open('../config/file1.txt','r+',encoding='utf-8')
    >>> fd.read()
    'java rubby golinux windows aix'
    >>> fd.write("mage")
    4
    >>> fd.seek(0)
    0
    >>> fd.read()
    'java rubby golinux windows aixmage'
  • w+,打开文件读写,文件存在则覆盖,不存在则创建
  • >>> fd = open('../config/file4.txt','w+',encoding='utf-8')
    >>> fd.write('guangzhou')
    9
    >>> fd.seek(0)
    0
    >>> fd.read()
    'guangzhou'
    >>> fd.seek(0)
    0
    >>> fd.write('hangzhou')
    8
    >>> fd.seek(0)
    0
    >>> fd.read()
    'hangzhouu'
  • a+,打开文件读写,存在则将指针置于末尾,不存在则创建新文件
  • >>> fd = open('../config/file4.txt','a+',encoding='utf-8')
    >>> fd.read()
    ''
    >>> fd.seek(0)
    0
    >>> fd.read()
    'hangzhouu'
    >>> fd.close()
    >>> fd = open('../config/file4.txt','a+',encoding='utf-8')
    >>> fd.write('beijing')
    7
    >>> fd.read()
    ''
    >>> fd.seek(0)
    0
    >>> fd.read()
    'hangzhouubeijing'
  • rb+, wb+, ab+ 对象是二进制,其他以上面一样

8.‘U’,deprecated

指针位置

1.f.tell(),告知字符指针位置

2.f.seek(),移动字符指针位置,f.seek(0)文件开头

>>> fd = open('../config/file4.txt','r',encoding='utf-8')
>>> fd.tell()
0
>>> fd.seek(0)
0
>>> fd.tell()
0
>>> fd.read(1)
'h'
>>> fd.tell()
1
>>> fd.read(2)
'an'
>>> fd.tell()
3
>>> fd.seek(0)
0
>>> fd.readline()
'hangzhouubeijing\n'
>>> fd.tell()
17

读取文件的4个read,默认从头开始读,并将将指针留在行尾

1.fd.read(size)

  • 默认省略size,size为整型,字符个数
  • 读取全部内容到内存,并将指针留在行尾
  • 大文件读取不要用,占内存
  • 返回的是字符串类型
  • >>> fd = open('../config/file4.txt','r',encoding='utf-8')
    >>> fd.read()
    'hangzhouubeijing'
    >>> fd.seek(0)
    0
    >>> fd.read(1)
    'h'
    >>> fd.read(2)
    'an'
    >>> fd.read(3)
    'gzh'
    >>> fd.seek(0)
    0
    >>> fd.read(6)
    'hangzh'

2.fd.readline(size)

  • 默认一行行读取,size与上面一样
  • 占用内存小
  • 每行结尾带换行符
  • >>> fd = open('../config/file4.txt','r',encoding='utf-8')
    >>> fd.readline()
    'hangzhouubeijing\n'
    >>> fd.readline()
    'shenzhen\n'
    >>> fd.readline()
    'shanghai\n'
    >>> fd.readline(1)
    'a'
    >>> fd.readline(2)
    'nh'
    >>> fd.readline()
    'ui\n'
    >>> fd.readline()
    'guangdong\n'
    >>> fd.readline()
    'zhejiang'
    >>> fd.readline()
    ''

3.fd.readlines(size)

  • 讲文本全部转换成列表,size表示下标
  • >>> fd = open('../config/file4.txt','r',encoding='utf-8')
    >>> fd.readlines()
    ['hangzhouubeijing\n', 'shenzhen\n', 'shanghai\n', 'anhui\n', 'guangdong\n', 'zhejiang']
    >>> fd.seek(0)
    0
    >>> fd.readlines(1)
    ['hangzhouubeijing\n']
    >>> fd.readlines()
    ['shenzhen\n', 'shanghai\n', 'anhui\n', 'guangdong\n', 'zhejiang']

4.fd.readable()

  • 返回布尔值,判断文件是否可读
  • >>> fd = open('../config/file4.txt','r',encoding='utf-8')
    >>> fd.readable()
    True

循环遍历迭代文本内容对象(遍历操作都可以这么干)

>>> fd = open('../config/file4.txt','r',encoding='utf-8')
>>> for line in fd:
... print(line)
...
hangzhouubeijing shenzhen shanghai anhui guangdong zhejiang
>>> fd.seek(0)
0
>>> for index,line in enumerate(fd.readlines()):
... print(index,line)
...
0 hangzhouubeijing 1 shenzhen 2 shanghai 3 anhui 4 guangdong 5 zhejiang
>>>

其他方法

close(self, /) 关闭打开的文件

  • |      Flush and close the IO object.
  • |
  • |      This method has no effect if the file is already closed.

detach(self, /) 干嘛用?

  • |      Separate the underlying buffer from the TextIOBase and return it.
  • |      After the underlying buffer has been detached, the TextIO is in an
  • |      unusable state.
>>> fd.detach()
<_io.BufferedReader name='../config/file4.txt'>
>>> fd.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: underlying buffer has been detached

fileno(self, /) 返回文件描述符,干嘛用?

  • |      Returns underlying file descriptor if one exists.
  • |      OSError is raised if the IO object does not use a file descriptor.
>>> fd = open('../config/file4.txt','r',encoding='utf-8')
>>> fd.fileno()
4
>>> fd = open('../config/filexxx.txt','w+',encoding='utf-8')
>>> fd.fileno()
3

flush(self, /) 将缓存立即写入硬盘,提高效率

  • |      Flush write buffers, if applicable.
  • |      This is not implemented for read-only and non-blocking streams.
import time
import sys
for i in range(40):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)

isatty(self, /) 是否连接到终端设备

  • |      Return whether this is an 'interactive' stream.
  • |      Return False if it can't be determined.

seekable(self, /)

  • |      Return whether object supports random access.
  • |      If False, seek(), tell() and truncate() will raise OSError.
  • |      This method may need to do a test seek().

truncate(self, pos=None, /)

  • |      Truncate file to size bytes.
  • |      File pointer is left unchanged.  Size defaults to the current IO
  • |      position as reported by tell().  Returns the new size.
>>> fd = open('../config/file4.txt','r+',encoding='utf-8')
>>> fd.truncate()
0

writable(self, /) 判断文件是否以写模式打开
 |      Return whether object was opened for writing.

>>> fd = open('../config/file4.txt','r+',encoding='utf-8')
>>> fd.writable()
True
>>> fd = open('../config/file1.txt','r',encoding='utf-8')
>>> fd.writable()
False

修改文件的两种方式:

1.全部读入内存,修改完毕之后覆盖写入源文件

2.一行一行读取内存,修改完毕之后写入新文件,用新文件覆盖旧文件

练习一:实现sed替换功能

练习二:修改haproxy配置文件

python3.x 基础三:文件IO的更多相关文章

  1. Python 基础三 文件 函数

    今天回顾一下之前学的文件操作相关知识点,对于文件的操作,主要有一下几部分构成: 一.文件的基础知识 1.文件操作的基本流程 文件操作其实可以分成三大部分: 1.打开文件,获取文件句柄并赋予一个变量 2 ...

  2. python3【基础】-文件操作

    1. python对文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件操作 关闭文件 现有如下文件: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧明. ...

  3. python3.x 基础三:字符集问题

    总结了一张表,更详细信息百度百科: 序号 年份 编码 标准协会 特点 二进制长度 字符长度 表现 1 1967 ASCII 美国国家标准学会(American National Standard In ...

  4. python3.x 基础三:装饰器

    装饰器:本质是函数,用于装饰其他函数,在不改变其他函数的调用和代码的前提下,增加新功能 原则: 1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 3.装饰函数对于被装饰函数透明 参考如 ...

  5. python3.x 基础三:函数

    1.OOP 面向对象编程,万物皆对象,以class为主,抽象化 2.POP 面向过程变成,万事皆过程,def定义过程 3.函数式编程,将某种功能封装起来,用的时候直接调用函数名,def定义函数,也叫f ...

  6. python3.x 基础三:set集合

    集合,set(),记住: 1个特点:去重,把列表变成集合,达到自动去重操作,无序 5个关系:测试两个列表的交差并子反向差集 方法: |  add(...) 常用,已存在元素去重不生效 |      A ...

  7. (代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

    上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现. 传统IO-intsmaze 传统文件IO操作的基础代码如下: FileInputStream in = new FileI ...

  8. (理论篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

    为了快速构建项目,使用高性能框架是我的职责,但若不去深究底层的细节会让我失去对技术的热爱. 探究的过程是痛苦并激动的,痛苦在于完全理解甚至要十天半月甚至没有机会去应用,激动在于技术的相同性,新的框架不 ...

  9. 三、文件IO——系统调用

    3.1 文件描述符 文件IO 系统调用是不带缓存的,文件 I/O 系统调用不是 ANSI C 的组成部分,是 POSIX 的组成部分. 系统调用与C库: C库函数的IO 的底层还是调用系统调用 I/O ...

随机推荐

  1. 27.rm命令

    rm命令可以删除指定的文件或目录.也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 选项:-f:强制删除. -r:递归处理,将指定目录下的 ...

  2. RxJava2源码解析(二)

    title: RxJava2源码解析(二) categories: 源码解析 tags: 源码解析 rxJava2 前言 本篇主要解析RxJava的线程切换的原理实现 subscribeOn 首先, ...

  3. Oliver Twist

    对于济贫院那些绅士们而言,贫民好吃懒做.贪得无厌.他们消耗的食物即是对教区最大的威胁. 绅士们的利益得不到满足时,孤儿们只能被驱之而后快,甚至被"加价出售". 然而,眼泪这种东西根 ...

  4. 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别

    关于模板什么的还有算法的具体介绍 戳我 这里我们只做所有最短路的具体分析. 那么同是求解最短路,这些算法到底有什么区别和联系: 对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时 ...

  5. postman(参数化)

    一.参数化 1.新建csv文件 2.csv文件中输入变量名和参数 3.postman中新增接口,并设置变量 4.选择进入runner页面 方法一 方法二 5.导入参数化csv格式文件,点击run It ...

  6. 大batch任务对structured streaming任务影响

    信念,你拿它没办法,但是没有它你什么也做不成.—— 撒姆尔巴特勒 前言 对于spark streaming而言,大的batch任务会导致后续batch任务积压,对于structured streami ...

  7. 软件——eclipse debug小技巧

    1.开启调试: 在代码编辑处右键单击,在弹出菜单中点击Debug As开始调试 2.几个快捷键: F5:跟入Step into, 一般会跟踪进入到调用函数的函数体,Step Over则不会跟踪进入,直 ...

  8. C. Ilya And The Tree 树形dp 暴力

    C. Ilya And The Tree 写法还是比较容易想到,但是这么暴力的写法不是那么的敢写. 就直接枚举了每一个点上面的点的所有的情况,对于这个点不放进去特判一下,然后排序去重提高效率. 注意d ...

  9. dfs+线段树 zhrt的数据结构课

    zhrt的数据结构课 这个题目我觉得是一个有一点点思维的dfs+线段树 虽然说看起来可以用树链剖分写,但是这个题目时间卡了树剖 因为之前用树剖一直在写这个,所以一直想的是区间更新,想dfs+线段树,有 ...

  10. python2执行程序报错:NameError: name 'y' is not defined

    然后运行一直报错 这个错误,是由于版本不同造成的语法错误,在python3中,输入可以使用input,但如果你的版本是python2,那么此时input就得改成raw_input,否则你输入数据会被当 ...