三元运算文件操作

Posted neozheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三元运算文件操作相关的知识,希望对你有一定的参考价值。

三元运算:

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

# 简单条件语句:
if 条件成立:
    val = 1
else:
    val = 2

# 变成三元运算是:

val = 1 if 条件成立 else 2

 

文件操作:

文件操作包括读、写、修改。

读:

f = open( file = \' F: /工作日常/文件名.txt\' , mode = \'r\', encoding = \'utf-8\')   # \'r\' 表示以(文本)读的模式打开文件(只能把文本转化成字符串), encoding= 的作用是: 以什么格式储存的文件, 就让Python以什么格式打开。如果不指定,Python就按默认的格式打开,Python3默认的是utf-8。  #  读取出来的内容是字符串格式。
data = f.read()   #读取文件并赋值   # f.read()是读取所有内容
f.close()

注:数据在硬盘上是以二进制的模式储存

f.read(1)  #读取一个字符

二进制读:

f = open( file = \' F: /工作日常/文件名.txt\' , mode = \'rb\')    #  \'rb\' 的意思是二进制读的模式, 把要读的内容不需要转码,直接以二进制的形式读到内存里(就是硬盘怎么存的就怎么拿出来)。两种情况需要这种读取模式:1. 不知道它是什么编码格式  2. 用于读取视频、图片、网络文件传输的文本。 

检测编码工具: chardet

import chardet
f= open(\'文件名\', \'rb\')
data = f.read()
print( chardet.detect(data))   

循环读取文件:

f = open( \'文件\' , \'r\', encoding = \'gbk\')
for line in f:     #语法:就是一次取一行
    print(line)    # 文件中没有空行,但利用循环打印出的结果每行之间都有空行,原因:文本中每行结束有个换行符\\n,并且 print()里面也默认有一个换行符,每打印完一次都会换行。
f.close()

 

写:(本质上是“创建”模式)

f = open( file = \'d:/工作日常/文件名.txt\' , mode=\'w\', encoding=\'gbk\')   # ‘w’表示创建一个文件,encoding=\'gbk\' 表示将要写入的Unicode字符串编码成gbk的格式创建并保存
f.write(\' 内容 \')   # 表示写入内容,写入的内容传入的时候是Unicode字符串类型,内部会根据encoding自动转换成指定编码的010101010101(即:字节类型)
f.close()

"""
注:1. 用这种模式也可以直接创建一个文件,文件名就是你在open()中命名的“文件名.txt”。
    2.  f.write( )  所写的内容只能是字符串
"""

二进制写:

f= open( file = \'d:/工作日常/文件名.txt\' , mode=\'wb\')   #\'wb\' 表示只以2进制模式写
f.write(\'内容\' .encode(\'gbk\'))    # .encode(\'gbk\') 表示写入时需要直接传入何种格式的编码(如‘gbk’),如果不写默认的是‘utf-8’  # 或者说是,写入的时候编码成“GBK”的二进制格式
f.close()

注:

1. 文件操作时,以 “w”或“wb” 模式打开,则只能写,并且在打开的同时先将内容清空;(原先的内容在open的那一步就被清空了)

2. 写入到硬盘上时: 

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

 

追加:

f = open( file = \'d:/工作日常/文件名.txt\' , mode=\'a\', encoding=\'gbk\')
f.write(\' 内容 \') 
f.close()

二进制追加:

f= open( file = \'d:/工作日常/文件名.txt\' , mode=\'ab\')
f.write(\'内容\' .encode(\'gbk\')) 
f.close()

 

读写:

f = open( file = \' F: /工作日常/文件名.txt\' , mode = \'r+\', encoding = \'utf-8\')
data = f.read() 
f.close()
# 注:read的时候在文件最前面有个小光标,read完或者write完之后会小光标会向后移动,最次read的时候光标只会往后面走,不会再read以前已经read过或者write过的内容。

 

文件操作其他功能:

fileno()   #返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到(网络编程)
flush()  # 把文件从内存buffer(缓存)里强制刷新到硬盘
readline()  #只读一行,遇到\\r 或者 \\n为止   #读取出来的内容是字符串格式

f.tell()   #返回当前文件光标的位置  # 返回的是字节所在位置
f.seek(数字)  #  把操作文件的光标移到指定位置   # 注意seek的长度是按字节算的, 不同字符编码存每个字符所占的字节长度不一样。
f.truncate()  # 从光标当前位置往后截断,只保留前面的内容。 也是按字节去截断。truncate()里面要是有数字,就是从头开始截多少个字节留下来。  #不能是‘r’模式 
f.flush(self)  # 把文件从内存buffer里强制刷新到硬盘

 

修改:

f = open(\'文件名.txt\', \'r+\', encoding= \'utf-8\')
f.seek(数字)
f. write(\' 你好\')    #插入后就把原先的内容覆盖了
f.close

覆盖原因:  

注: 出于以上的原因,文件不要在硬盘上修改,但可以把内容全部读到内存里,数据在内存里是可以随便增删改查的,修改之后,把内容再全部写回硬盘,把原来的数据全部覆盖掉。vim Word等各种文本编辑器的工作原理就是这样的。

 

文件修改示例: 

思路: 把要修改的文件中的内容逐行读取到内存就行修改,优点: 省内存, 缺点:需要再创建一个文件,多占了硬盘。

import os
f_name = \'文件操作测试.txt\'
f_new_name = \'文件操作测试.txt.new\'   #创建一个新的文件名

old_str = \'狗猴\'
new_str = \'廖小伟\'  #用于修改、替换的内容

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:  #判断读取到内存的那行内容里面 有没有要替换的
        line = line.replace(old_str,new_str)    # 内容(字符串的格式)替换
    f_new.write(line)  # 替换的内容写到新文件中
f.close()
f_new.close()  # 关闭两个文件夹

os.replace(f_new_name,f_name)  # replace之前要把两个文件都close,要不然文件内容还在内存中,replace不了

 

以上是关于三元运算文件操作的主要内容,如果未能解决你的问题,请参考以下文章

python----基础之三元运算文件操作

python课堂5:文件操作,三元运算:

python基础操作_集合_三元运算

python基础:python循环三元运算字典文件操作

4.三元运算/集合类型/字符串操作

Python学习——02-Python基础——4-文件处理与三元运算