python-文件处理

1,文件处理

  1,三元运算

  三元运算又称三目运算,是对简单的条件语句的缩写,如:

if 条件成立:
    val = 1
else:
    val =2

换算成三元运算就是:

val = 1 if 条件成立 else 2

  2,文件处理

    读,写,修改

   1.0 r 读模式  

f = open(file = '这里是文件路径', mode = 'r', encoding =  'utf-8')
data = f.read()
f.close() 

# 这里file后面冒号里面是文件路径
# mode = r :表示文本只读模式,可以改为其他权限
# encoding...这里是以前原文件是什么编码写入的,现在以什么编码读出
# f.read()表示读取文件
# f.close()关闭文件

    1.1 rb 二进制读模式

      适用于不知道原文件的编码,但是想将文件以二进制编码展示出来,这时读出来的文件则为二进制文件,而此模式一般用于读取网络传输的文本,图片,视频。

      注意,它在读写的时候是以bytes类型读写的,因此获得的是一个bytes对象而不是字符串。在这个读写过程中,需要自己指定编码格式。

       在使用带b的模式时一定要注意传入的数据类型,确保为bytes类型。

        
f = open('file_test', mode = 'rb')
data = f.read()
print(data)

# b'\xe6\x81\xad\xe5\x96\x9c\xe4\xbd\xa0\xe8\xaf\xbb\xe5\x87\xba\xe6\x9d\xa5\xe4\xba\x86\r\n\xe6\x88\x91\xe5\xb0\xb1\xe6\x98\xaf\xe5\xa4\xa7\xe5\xb8\x85\xe5\x93\xa5\xe4\xb8\x80\xe6\x9e\x9a\r\n'
# 这里是以这种格式显示出来。
View Code

   1.2 循环文件 for

     对于很大的文件,为了不一下子将内存占满,可以采用循环文件的方法来读文件。即每次都只读一部份文件。

      
f = open("这里为文件的路径","r",encoding = "gbk")
for line in f:
    print(line)
f.close()
View Code

因为print每次打印出来都会自带换行,所以这个打印出来的数据之间都会多了一个行。

   2.0 w 写模式

f = open('文件路径,若无此文件,则会创建', 'w', encoding='utf-8')
f.write('这里是写入文件的内容')
f.close() #写入的内容是unicode字符串类型,内部会根据encoding转换为制定编码的 01101010101,即:字节类型

   2.1 wb 二进制写文件

f = open('文件路径,若无此文件,则会创建', 'wb')
f.write('这里是写入文件的内容',encode='gbk')
f.close()

    注意     

      对于w,着重于创建,而不是修改,所以重复在一个文件里面重复进行写入操作,会直接先清空原文件内容,然后重新写入

      wb,写入时需要直接传入以某种编码的0100101,即:字节类型
      w 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010

   3.0 a ab 追加模式    

      将内容追加到文件尾部。

f = open('file_test', 'a',encoding='gbk')
f.write('\n这个是新添加进来的内容')
f.close()

f = open('file_test', 'ab')
f.write('\n这个是新添加进来的内容'.encode('gbk'))  #注意这里后面是一个点号
f.close()

   4.0 混合操作

       r+: 读写模式,先读后写,以读的模式打开,支持追加内容

      写读模式没有什么作用    w+: 写读模式,先写后读,以写(创建)的模式打开,先清空原有内容,相比于w模式,只是支持了一个读功能,且还只能读写已经写入的新内容

f = open('file_test02', 'r+', encoding='gbk')
f.write('这个是混合模式了\n你好呀1\n你好呀2\n你好呀3')
data = f.read()
print(data)
f.close()

    问与答

#1 问:为什么这样子?

这是硬盘的存储原理导致的,当你把文件存到硬盘上,就在硬盘上划了一块空间,存数据,等你下次打开这个文件 ,
seek到一个位置,每改一个字,就是把原来的覆盖掉,如果要插入,是不可能的,因为后面的数据在硬盘上不会整体向后移。
所以就出现 当前这个情况 ,你想插入,却变成了会把旧内容覆盖掉。 #2 问:但是人家word, vim 都可以修改文件 呀,你这不能修改算个什么玩意? 我并没说就不能修改了,你想修改当然可以,就是不要在硬盘上修改,把内容全部读到内存里,
数据在内存里可以随便增删改查,修改之后,把内容再全部写回硬盘,把原来的数据全部覆盖掉。
vim word等各种文本编辑器都是这么干的。 #3 问:说的好像有道理,但你又没看过word软件的源码,你凭什么这么笃定? 哈哈,我不需要看源码,硬盘 的存储原理决定了word必须这么干 ,不信的话,
还有个简单的办法来确认我说的,就是用word or vim读一个编辑一个大文件 ,至少几百MB的,你 会发现,
加载过程会花个数十秒,这段时间干嘛了? cpu 去玩了?去上厕所啦? 当然不是,是在努力把数据 从硬盘上读到内存里。 # 4问:但是文件如果特别大,比如5个GB,读到内存,就一下子吃掉了5GB内存,好费资源呀,有没有更好的办法呢? 如果不想占内存,只能用另外一种办法啦,就是边读边改, 什么意思? 不是不能改么?是不能改原文件 ,
但你可以打开旧文件 的同时,生成一个新文件呀,边从旧的里面一行行的读,边往新的一行行写,
遇到需要修改就改了再写到新文件 ,这样,在内存里一直只存一行内容。就不占内存了。 但这样也有一个缺点,
就是虽然不占内存 ,但是占硬盘,每次修改,都要生成一份新文件,虽然改完后,可以把旧的覆盖掉,但在改的过程中,还是有2份数据 的。 # 5问:还有更好的方式 么? 有完没完? 没了。

   5.0 文件操作的其他功能:tell,seek

      ①flush: f.flush, 将刚刚写入的文件从内存buffer里强制刷新到硬盘;

         ②readline: f.readline, 只读一行,遇到\r or \n为止;

      ③seek:f.seek( )把操作文件的光标移到指定位置

          *注意:seek的长度是按字节算的(read 是按照字符来算的),字符编码存每个字符所占的字节长度不一样。

          如‘我是你爸爸’用gbk存是两个字节一个字,用utf-8就是三个字节,因此以gbk打开时,seek(4)就把光标切换到“是”

           但如果是utf-8,seek(4)会导致,拿到了是这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用相应字节不能表示一个字符。

      ④seekable:f.seekable() ,判断文件是否可进行seek操作。

      ⑤tell:f.tell(), 返回当前文件操作光标位置。

      ⑥truncate: f.truncate(), 按指定长度截断文件。指定长度的话,就是从文件开头截定指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。

      ⑦writable: f.writable(), 判断文件是否可写。

   6.0 with关键字

with关键字用于Python的上下文管理器机制。为了防止诸如open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,文件非正常关闭等可能导致文件泄露、破坏的问题。Python提供了with这个上下文管理器机制,保证文件会被正常关闭。在它的管理下,不需要再写close语句。注意缩进。

with open('test.txt', 'w') as f:
    f.write('Hello, world!')

with支持同时打开多个文件:

with open('log1') as obj1, open('log2','w') as obj2:
    s=obj1.read()
    obj2.write(s)

   7.1 修改文件  

    占硬盘修改   

      
f1 = open('file_test03', 'r', encoding='utf-8')
f2 = open('file_test03.new', 'w', encoding='utf-8')

old_str = '钱大发'
new_str = '钱小发'
for line in f1:
    if old_str in line:
        line = line.replace(old_str, new_str) # 这里是替换,将旧字符替换为新的字符。
    f2.write(line)
f1.close()
f2.close()
View Code

      占内存修改

猜你喜欢

转载自www.cnblogs.com/wuqiuming/p/9335190.html