在讲述fileinput模块之前,首先说一下python内置的文件API—open()函数以及与其相关的函数。

我这里主要讲讲其中四个比较重要和常用的方法,更多的方法,可以参考:菜鸟教程http://www.runoob.com/python/file-methods.html

(1)file = open(file_name [, access_mode][, buffering])

参数解析:

1. file_name:

file_name变量是一个需要访问的文件名称的字符串值,在应用中需要用单引号或者双引号将文件名包裹起来。

2. access_mode:

access_mode决定了打开文件的模式:只读,写入,追加等。这个参数是非强制的,默认文件访问模式为只读(r)

详细模式可以参考:菜鸟教程http://www.runoob.com/python/python-files-io.html

3. buffering:

这个参数用于设置缓存区的大小。如果buffering的值被设为0,就不会有缓存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,这个整数就为缓存区的缓存大小。如果取负值,寄存区的缓冲大小则为系统默认。

(2)file.flush()方法

用于刷新缓冲区,,即将缓冲区中的数据立刻写入文件,同时清空缓冲区

flush()方法在爬虫中也用得挺多,在爬虫过程由于种种原因,程序中断,写入缓存的数据没有写入磁盘很可惜,所以可以手动添加flush()方法

(3)file.close()方法

关闭文件,并将缓冲区的数据写入文件中。

文件的缓存机制

在写入文件内容的时候,在我们调用python的write()函数对文件进行写入的时候,python解析器会调用操作系统的write方法,但值得注意的是,不是马上保存到磁盘中的,是先写到内核的缓冲区里面,只有当我们主动调用flush()函数或者close()函数的时候,才会将缓冲区的内容写入磁盘中。另外当写入的数据量大于或者等于缓冲区的大小的时候,写缓冲会自动同步到磁盘。

例如:

写20万行数据结果

file = open('file1.txt','a+')for i in range(200000):

file.write('this line is line%s'%i)

file.write(' ')

pycharm报出如下的提示

因为我设置的buffering是默认的系统的缓存大小,所以当写到1999856行时,就刚好到系统的缓存区大小,因为所需要写的数据大于缓存区的大小,所以这些内容直接就写入了磁盘,而1998856后面的数据在写入的时候还是先写到了缓存区中,而这些数据的大小显然是小于缓存区大小的,所以被保存在缓存区中,并没有写到磁盘。

使用flush()方法后,所有在缓存区的数据都会写入到磁盘中

如果我直接在调用open()方法的时候像下面这样设置buffering为1,就无需担心缓存的问题了

(4)file.seek(offset [,whence]) 文件指针

当文件进行写入或者读取的时候,文件指针会根据具体的内容进行移动。灵活地运用seek()方法,可以在一次I/O操作中对文件同时进行写和读操作,避免多次的I/O。

参数解析:

offset:偏移量,代表需要移动偏移的字节数

whence:可选参数,默认值为 0。作用是给offset参数设定起始值,表示要从哪个位置开始偏移。0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

例如以下案例:

file = open('file.txt','a+',1)for i in range(200):

file.write('this line is line%s'%i)

file.write(' ')for line infile:print(line)

file.close()

终端没有打印任何数据

如果将代码顺序修改一下

file = open('file.txt','a+',1)for i in range(200):

file.write('this line is line%s'%i)

file.write(' ')

file.close()

f= open('file.txt','r+')for line inf:print(line)

f.close()

终端打印出数据

那么怎么用seek()方法呢?

importos

file= open('file.txt','a+',1)for i in range(200):

file.write('this line is line%s'%i)

file.write(' ')

file.seek(0,os.SEEK_SET)for line infile:print(line)

file.close()

同样也能打印出数据

上面,我用了os模块的SEEK_SET

os模块有这些内容:

os.SEEK_SET:表示文件的相对起始位置

os.SEEK_CUR:表示文件的相对当前位置

os.SEEK_END:表示文件的相对结束位置

关于fileinput模块

fileinput可以对文件进行细致化的处理,比直接的open方法有更多文件操扩展。可以一次性迭代一个或者多个文件,并对文件进行修改。

主要的函数有:

1. input([files[,inplace[,backup]]]) 帮助迭代多个输入流中的行

2. filename() 返回当前文件的名称

3.nestfile() 关闭当前文件并移动到下一个文件

4. close() 关闭序列(多个文件

5. lineno() 返回(多个文件累计的)当前行号

6. filelineno() 返回在当前文件的行好

7. isfirstline() 检查当前是否是当前文件中的第一行

8. isstdin() 检查最后一行是否来自sys.stdin

可以理解,fileinput模块重点是对多文件的读取和适当时候的修改。而没有直接的写操作

1. input()方法

这个函数是fileinput模块中最重要的一个函数,参数相对复杂一点。

官方的定义:

fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])

input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)

1)files列表,可以是一个文件,也可以是多个文件的列表形式

2)inplace 是否对文件进行就地修改。默认为False,设置为False跟文件的open区别不大

3)mode 读取的格式

官方:FileInput opening mode must be one of 'r', 'rU', 'U' and 'rb' (b:二进制字节模式和U:unicode模式)

4)backup 文件备份,为原本的文件做一份备份,不作任何修改,其实就是复制。备份的文件名是原本的文件名+备份文件名。注意备份文件需要把文件的格式也写进去。一般backup需要与参数inplace一起使用才有意义。而在设置了inplace=True,一般同时会设置backup参数来备份原本的文件内容。

例子:在每一行文本的前面添加 "#行号’字样

单个文件案例:

for line in fileinput.input('file.txt',inplace=True,mode='r',backup='file_back.txt'):

num=fileinput.filelineno()print('#%s'%num+' '+line)

如果inplace设置为True,即就地修改,必须要有print函数将读取的数据重新写回当前的文件中,否则文件的数据最后会变成空。所以使用inplace时候必须很小心。

备份后的文件目录

多个文件案例

for line in fileinput.input(files=['file.txt','file1.txt'],inplace=True,mode='r',backup='file_back.txt'):

num =fileinput.filelineno()

print('#%s'%num+' '+line

通常fileinput模块会结合re模块一起使用,例如在对日志的分析中会很有用

例如,这里有一个monoodb的log文件内容

希望获取日期为11-13的日志

importfileinputimportrefor line in fileinput.input('mongolog.txt',mode='r',inplace=True,backup='log_backup.txt'):

pattern= '2018-11-13'

ifre.search(pattern,line):print(line)

获取结果在原log.txt文件中,备份文件中的内容与原文件相同

python写文件读文件-python--文件流读写相关推荐

  1. python按行读字符串,python按行读取文件并找出其中指定字符串

    python怎么提取出文件里的指定内容 python读取文件内容的方法: 一.最方便的方法是一次性读取文件中的所有内容并放置到一个大字符串中: all_the_text = open('thefile ...

  2. python写sql语句_Python操作文件模拟SQL语句功能

    一.需求 当然此表你在文件存储时可以这样表示 1,Alex Li,22,13651054608,IT,2013-04-01 现需要对这个员工信息文件,实现增删改查操作 1. 可进行模糊查询,语法至少支 ...

  3. python写错了怎么更改-Python中如何修改文件?Python文件修改方法

    文件的数据是存放于硬盘上的,因而只存在覆盖.不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式: 方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改 ...

  4. Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解

    文章目录 前言 Rocksdb写流程图 WAL 原理分析 概述 文件格式 查看WAL的工具 创建WAL 清理WAL MANIFEST原理分析 概述 查看MANIFEST的工具 创建 及 清除 MANI ...

  5. JAVA NIO文件映射、通道、流读写文件示例

    本例使用FileChannel和 BufferedInputStream等测试对比. TestHandler.java 用于实现动态代理,测试运行效率 package com.test;import ...

  6. python写一个系统-使用Python写一个量化股票提醒系统

    大家在没有阅读本文之前先看下python的基本概念, Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开 ...

  7. python写脚本入门-学习Python的教程?:python 脚本菜鸟教程

    学习Python的教程? Python作为一门面向对象的性语言,其实它的学习也很简单 - 配置 - Python基础(语法..数据类型.高级变量.函数.Python高级特性) - 面向对象编程.面向对 ...

  8. python写炒股软件_使用Python写一个量化股票提醒系统

    大家在没有阅读本文之前先看下python的基本概念, Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开 ...

  9. python写游戏脚本-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  10. python如何在没有环境的电脑上执行_没安装python的电脑可以运行python写的程序吗 python语言编写的程...

    py2exe 能够把 Python script 转换成可以在windows上独立执行的(即不需安装Python)的exe程序(加上其它必需的运行时函数库). -- 摘自百度知道 py2exe能够把P ...

最新文章

  1. Mac下配置Maven
  2. r语言删除csv中na行_r语言,csv数据,提取特定行
  3. Rsync+sersync同步配置
  4. [Python爬虫] Selenium自动访问Firefox和Chrome并实现搜索截图
  5. Interactive Report UI - IFrame
  6. mysql时间戳计算_mysql根据时间戳计算
  7. 德克萨斯州ADRN组织支持12种加密货币捐赠 现已收到700美元ETH捐款
  8. php 微信转发朋友圈,php微信分享到朋友圈、QQ、朋友、微博
  9. cf519C. A and B and Team Training(找规律)
  10. systemtap初体验
  11. html前端小技巧—div半透明设置技巧
  12. arcgis拼接影像
  13. 无线手柄在ROS上的使用
  14. 数据清理、转换、合并、重塑
  15. 金融大数据信用评分模型解析
  16. java实现hj协议_HJ212协议java 实现 封装好的环保212协议代码 - 下载 - 搜珍网
  17. 【基础强训】day4
  18. P3258[JLOI2014]松鼠的新家(LCA 树上差分)
  19. 恶意代码机理与防护笔记
  20. C语言,指针指针指针

热门文章

  1. android从放弃到精通 第四天 happy
  2. Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue
  3. Vue开发跨端应用(三)添加cordova
  4. 更新view是可以update到表的
  5. 双数组Trie树(DoubleArrayTrie)Java实现
  6. JavaScript 同时建立多个websocket连接
  7. Leetcode:Substring with Concatenation of All Words分析和实现
  8. 为什么一般要定义析构函数为虚析构函数
  9. Python之os.walk()与os.path.walk()
  10. StrUtils.DupeString - 反复字符串