文件操作的其它功能

def fileno(self, *args, **kwargs): # real signature unknown

# 返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到

def flush(self, *args, **kwargs): # real signature unknown

# 把文件从内存buffer里强制刷新到硬盘

def readable(self, *args, **kwargs): # real signature unknown

# 判断是否可读

def readline(self, *args, **kwargs): # real signature unknown

# 只读一行,遇到\r or \n为止

def seek(self, *args, **kwargs): # real signature unknown

# 把操作文件的光标移到指定位置

# *注意seek的长度是按字节算的, 字符编码存每个字符所占的字节长度不一样。

# 如“路飞学城” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“飞”和“学”两个字中间。

# 但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节

def seekable(self, *args, **kwargs): # real signature unknown

# 判断文件是否可进行seek操作

def tell(self, *args, **kwargs): # real signature unknown

# 返回当前文件操作光标位置

def truncate(self, *args, **kwargs): # real signature unknown

# 按指定长度截断文件

# *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。

def writable(self, *args, **kwargs): # real signature unknown

# 判断文件是否可写

修改文件

尝试直接以r+模式打开文件,默认会把新增的内容追加到文件最后面。但我想要的是修改中间的内容 ,怎么办? 为什么会把内容添加到尾部呢?(最新测试r+会从头覆盖,测试代码如下)

f1 = open("luffy.txt",'w',encoding="utf-8")

f1.write("[路飞学城]")

f1.close()

f = open("luffy.txt",'r+',encoding="utf-8")

f.write("alex")

f.close()

我们已经学了seek,现在告诉你,之所以内容会追加到最后面,是因为,文件一打开,要写的时候,光标会默认移到文件尾部,再开始写。 现在我想修改中间部分,是不是seek(中间位置)再写就可以了呢?

f = open("兼职白领学生空姐模特护士联系方式utf8.txt",'r+',encoding="utf-8")

f.seek(6)

f.write("[路飞学城]")

f.close()

执行没报错,开心,看输出

王心[路飞学城]9 46 13813234424

马纤羽 深圳 173 50 13744234523

乔亦菲 广州 172 52 15823423525

罗梦竹 北京 175 49 18623423421

刘诺涵 北京 170 48 18623423765

岳妮妮 深圳 177 54 18835324553

贺婉萱 深圳 174 52 18933434452

叶梓萱 上海 171 49 18042432324

杜姗姗 北京 167 49 13324523342

black girl 河北 167 50 13542342233

确实从第3个字开始改的,但是我擦,好像我的[路飞学城] 把后面的内容覆盖啦。。。。,这不是我想要的呀。。。

问:为什么这样子?

这是硬盘的存储原理导致的,当你把文件存到硬盘上,就在硬盘上划了一块空间,存数据,等你下次打开这个文件 ,seek到一个位置,每改一个字,就是把原来的覆盖掉,如果要插入,是不可能的,因为后面的数据在硬盘上不会整体向后移。所以就出现 当前这个情况 ,你想插入,却变成了会把旧内容覆盖掉。

问:但是人家word, vim 都可以修改文件 呀,你这不能修改算个什么玩意?

我并没说就不能修改了,你想修改当然可以,就是不要在硬盘上修改,把内容全部读到内存里,数据在内存里可以随便增删改查,修改之后,把内容再全部写回硬盘,把原来的数据全部覆盖掉。vim word等各种文本编辑器都是这么干的。

问:说的好像有道理,但你又没看过word软件的源码,你凭什么这么笃定?

哈哈,我不需要看源码,硬盘 的存储原理决定了word必须这么干 ,不信的话,还有个简单的办法来确认我说的,就是用word or vim读一个编辑一个大文件 ,至少几百MB的,你 会发现,加载过程会花个数十秒,这段时间干嘛了? cpu 去玩了?去上厕所啦? 当然不是,是在努力把数据 从硬盘上读到内存里。

问:但是文件如果特别大,比如5个GB,读到内存,就一下子吃掉了5GB内存,好费资源呀,有没有更好的办法呢?

如果不想占内存,只能用另外一种办法啦,就是边读边改, 什么意思? 不是不能改么?是不能改原文件 ,但你可以打开旧文件 的同时,生成一个新文件呀,边从旧的里面一行行的读,边往新的一行行写,遇到需要修改就改了再写到新文件 ,这样,在内存里一直只存一行内容。就不占内存了。 但这样也有一个缺点,就是虽然不占内存 ,但是占硬盘,每次修改,都要生成一份新文件,虽然改完后,可以把旧的覆盖掉,但在改的过程中,还是有2份数据 的。

问:还有更好的方式 么?

有完没完? 没了。

占硬盘方式的文件修改代码示例

f_name = "兼职白领学生空姐模特护士联系方式utf8.txt"

f_new_name = "%s.new" % f_name

old_str = "乔亦菲"

new_str = "[乔亦菲 Yifei Qiao]"

f = open(f_name,'r',encoding="utf-8")

f_new = open(f_new_name,'w',encoding="utf-8")

for line in f:

if old_str in line:

new_line = line.replace(old_str,new_str)

else:

new_line = line

f_new.write(new_line)

f.close()

f_new.close()

上面的代码,会生成一个修改后的新文件 ,原文件不动,若想覆盖原文件

import os

f_name = "兼职白领学生空姐模特护士联系方式utf8.txt"

f_new_name = "%s.new" % f_name

old_str = "乔亦菲"

new_str = "[乔亦菲 Yifei Qiao]"

f = open(f_name,'r',encoding="utf-8")

f_new = open(f_new_name,'w',encoding="utf-8")

for line in f:

if old_str in line:

new_line = line.replace(old_str,new_str)

else:

new_line = line

f_new.write(new_line)

f.close()

f_new.close()

os.rename(f_new_name,f_name) #把新文件名字改成原文件 的名字,就把之前的覆盖掉了,windows使用os.replace # 帮助文档说明replace会覆盖原文件

python打开文本文档时不允许其他程序修改_2.2.4 python 文件处理 - 文件其他操作修改...相关推荐

  1. python打开文本文档_带声明的Python –带打开的文件

    python打开文本文档 Python with statement allows us to write simpler code when working with context manager ...

  2. cmd命令打开文本文档_win10自带照片应用打开太慢,改用win7照片查看器

    win10照片这个应用的功能确实多了很多,但平时我们只是看个图片,它却打开太慢,不如win7照片查看器来的爽.但是win7照片查看器在win10里是隐藏的,需要给它在注册表里手动添加支持的格式,就是让 ...

  3. cmd命令打开文本文档_Windows10家庭版打开「本地组策略」

    在win10家庭版系统中默认是没有组策略的,组策略打不开无法进行相关所需要的一些设置,该如何解决呢?可以通过将[Windows10 家庭版]升级到[Windows10专业版]来解决,但这是不推荐的.那 ...

  4. C语言文件操作-总是打不开文本文档

    如果你新建一个名为"dictionary"的文本文档,就按下面样子加.txt FILE *h;h=fopen("dictionary.txt","r& ...

  5. python docx 合并文档 图片_不再为处理PDF烦恼,python处理操作PDF全攻略

    本篇聊下Python对pdf的各种操作,包含pdf转word,pdf转图片,pdf翻转,加密,加水印等. pdf转换word文档 保留格式 pdf转换为word文档,被大众经常使用的是纯Python库 ...

  6. python在使用绝对路径时出现OSError: [Errno 22] Invalid argument: ‘E:\python\python扩展\text_file\pi_digits.txt

    今天我在练习python文件的绝对路径时发现OSError: [Errno 22] Invalid argument: 'E:\python\python扩展\text_file\pi_digits. ...

  7. 想知道自己的某个内存的小视频总时长?那这篇CSDN很适合你,快来看看Python如何实现求MP4时长吧(包含os模块和moviepy模块的全套基础操作)

    今天我们就来看看哪个老司机的视频时长最长,嘿嘿嘿,废话不多说,任何内容都瞒不住咱的程序,包含os模块和moviepy模块的全套基础操作哦!我们直接开始! 老司机求视频时长 一.我们需要的模块与包的使用 ...

  8. python排版word文档命令方法大全_教你怎么使用Python对word文档进行操作

    使用Python对word文档进行操作 一.安装Python-docx Python-docx是专门针对于word文档的一个模块,只能读取docx 不能读取doc文件.说白了,python就相当于wi ...

  9. cmd命令打开文本文档_震惊!我竟然通过控制台打开了QQ!

    震惊且免,本文按逆序讲解实现的原理和如何实现. 如何实现 1.设置系统的环境变量.将桌面加入环境变量.即将下列两者加入环境变量: 个人桌面: C:Users你的用户名Desktop: 公共桌面: C: ...

最新文章

  1. vs2008中js的语法提示及修正功能(downmoonn)
  2. boost::local_function模块实现不可复制的 local_function的测试程序
  3. ubuntu配置GDB
  4. 《iVX 高仿美团APP制作移动端完整项目》02 搜索、搜索提示及类别需求分析思路及制作流程
  5. 高速信号传输约翰逊 pdf_高速串口技术如何突破板级连接限制
  6. VirtualBox 安装ghost版windows XP
  7. PHP 使用header函数设置HTTP头的示例方法 表头(转)
  8. 预防医学的曙光 | 微软要用AI构建免疫系统图谱
  9. 图文:2010中国计算机网络安全年会启明星辰展台
  10. [转]C++,VC++,MFC,ATL,WTL到底是什么关系么
  11. B站左程云算法视频中级班01
  12. DEFS一个前所未有的金融生态!
  13. Sql Server 中事务(begin tran/commit tran/rollback tran)的用法
  14. ZYNQMP_XAZU3EG_LINUX 默认启动项修改
  15. 上海市的某快递公司根据投送目的地距离公司的远近,将全国划分成5个区域: 0区 1区 2区 3区 4区 同城 临近两省 1500公里(含)以内 1500——2500公里 2500公里以上 上海 江苏
  16. Altium designer AD原理图导入word文档、pdf,生成矢量图的方法;
  17. Linux环境——MySQL安装及配置(5.7版本)
  18. 深度学习应用在图像分割上的网络模型概述
  19. Linux(CentOS)安装MySQL教程
  20. 如何计算 R 中 Z 分数的 P 值

热门文章

  1. 为什么尽量不要使用全局变量?
  2. 快速删除包含指定数字的数据
  3. 配置coredns解析公网域名
  4. PRD到底该怎么写?更全面的文档范例来了
  5. 北风:如何自学营销策划和网络营销?
  6. 解决本地连接不上虚拟机的问题
  7. 大数据分析工程师入门15-数据收集
  8. GFD233A 3BHE022294R0103
  9. 你的Kubernetes Java应用优雅停机了吗?
  10. 如何测试UDP端口连通性