用Python操做文件

用Python操做文件

用word操做一个文件的流程以下:python

一、找到文件,双击打开。程序员

二、读或修改。vim

三、保存&关闭。windows

用Python操做文件也差很少:编辑器

f=open(filename)  # 打开文件
f.write("我是野生程序员") # 写操做
f.read()  #读操做
f.close() #保存并关闭

不过有一点跟人肉操做word文档不一样,就是word文档只要打开了,就便可以读、又能够修改。 但Python比较变态,只能以读、建立、追加 3种模式中的任意一种打开文件,不能即写又读。测试

1、操做模式

  • r 只读模式
  • w 建立模式,若文件已存在,则覆盖旧文件
  • a 追加模式,新数据会写到文件末尾

2、建立文件

f = open(file='C:/工做平常/staff.txt',mode='w')
f.write("Kwan  CEO  100W\n")
f.write("KK  人事  5000\n")
f.close()

3、只读模式

f = open(file='兼职白领学生空姐模特护士联系方式.txt',mode='r')
print(f.readline())  # 读一行
print('------分隔符-------')
data = f.read()  # 读全部,剩下的全部
print(data)
f.close()

执行结果:编码

马纤羽     深圳    173    50    13744234523
------分隔符-------
乔亦菲     广州    172    52    15823423525
罗梦竹     北京    175    49    18623423421
刘诺涵     北京    170    48    18623423765
岳妮妮     深圳    177    54    18835324553
贺婉萱     深圳    174    52    18933434452
叶梓萱     上海    171    49    18042432324

你得有这么个文件才能用上面的代码。。。code

4、追加模式

f = open(file='兼职白领学生空姐模特护士联系方式.txt',mode='a')
f.write("黑姑娘 北京  168  48\n")  # 会追加到文件尾部
f.close()

5、循环文件

f = open(file='兼职白领学生空姐模特护士联系方式.txt',mode='r')
for line in f:
    line = line.split()
    name,addr,height,weight,phone = line
    height = int(height)
    weight = int(weight)
    if height > 170 and weight <= 50:
        print(line)
f.close()

输出:blog

['马纤羽', '深圳', '173', '50', '13744234523']
['罗梦竹', '北京', '175', '49', '18623423421']
['叶梓萱', '上海', '171', '49', '18042432324']

6、其它功能

def mode(self) -> str:
        # 返回文件打开的模式
    def name(self) -> str:
        # 返回文件名
    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
        # 判断文件是否可写

7、混合模式

  • w+ 写读 , 这个功能基本没什么意义,它会建立一个新文件 ,写一段内容,能够再把写的内容读出来,没什么卵用。
  • r+ 读写,能读能写,但都是写在文件最后,跟追加同样。
  • a+ 追加读,文件一打开时光标会在文件尾部,写的数据全会是追加的形式。

r+ 模式示例:索引

由于默认就是往文件尾部写入。

8、修改文件

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

问:为何原有数据会被覆盖呢?

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

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

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

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

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

问:还有更好的方式么?

没有。

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

f_name = "兼职白领学生空姐模特护士联系方式.txt"
f_new_name = "%s.new" % f_name
old_str = "刘诺涵"
new_str = "[黑姑娘]"
f = open(f_name,'r')
f_new = open(f_new_name,'w')
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 = "兼职白领学生空姐模特护士联系方式.txt"
f_new_name = "%s.new" % f_name
old_str = "刘诺涵"
new_str = "[黑姑娘]"
f = open(f_name,'r')
f_new = open(f_new_name,'w')
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会覆盖原文件
相关文章
相关标签/搜索