python-文件读写资料整理

 

# Date:2018/12/17
###################################################
# 1、打开文件
# 2、操作文件
# 3、关闭文件
# open('文件名','模式','编码')
# 默认情况下,是只读模式 r
# f = open('ha.log') # 打开ha.log文件 返回一个对象,以后要做操作的时候就操作这个对象
# data = f.read() # 读取这个文件
# f.close()
# print(data)
# my name is ha.log
########################
# 模式
# 1、 r,只读模式【默认】
# 2、 w,只写模式【不可读;不存在则创建;存在则清空内容;】
# 3、 x,只写模式【不可读;不存在则创建;存在则报错;】
# 4、 a,追加模式【不可读;不存在则创建;存在则只追加内容;】
##########################
#### ( r )只读模式【不指定模式时为默认模式】 ####

1、文件不存在则报错FileNotFoundError: [Errno 2] No such file or directory: 'bb'
1、打开文件后,指针位置为0,
2、读取文件时,从指针当前位置向后读取。(可用seek)
# f = open("ha.log",'r')
# f.write("aaaa")
# f.close()
# # io.UnsupportedOperation: not writable 报错,不能写
##########################
#### ( w ) 只写模式【不可读;文件不存在则创建;存在则清空内容;】 ####
1、文件不存在则创建文件
2、打开文件时,如果文件存在则文件所有内容先被清空,所以指针位置默认为0。
3、写入文件时,根据指针当前的位置向后覆盖去写
# f = open("ha1.log","w")
# f.close()
方式一:
  :在文件没有关闭之前,都可以写入进去,默认写入是按照顺序进行写的。
   在文件写入时,是按照指针位置向后覆盖去写。
f = open('bb', 'w', encoding='utf-8')
print(f.tell()) # 0
print(f.write('12345678910')) # 11
print(f.tell()) # 11
print(f.seek(2)) # 2
print(f.write('abc')) # 3
print(f.tell()) # 5
# print(f.write('22222dddd')) #
print(f.tell()) # 5
f.close()
f.write('aaaaa')
  # ValueError: I/O operation on closed file. value错误:关闭文件的I/O操作。
  # 意思是文件已经关闭了,你就没有办法在写了。
方式二:
  方式二中同样的方式,不会报错。
with open('aa', 'w', encoding='utf-8') as f1:
print(f1.tell())
print(f1.write('abcddddddd' + ' ')) #
print(f1.write('11111dddd' + ' ')) #
print(f1.write('22222dddd')) #
print(f1.tell())
print(f1.write('afafafaf')) #
##########################.
#### ( x )只写模式【不可读;文件不存在则创建;文件存在则报错;】 ####
1、文件不存在创建文件,文件存在则报错

2、功能和w功能类似,一般很少使用
# # f = open("ha1.log",'x')
# # FileExistsError: [Errno 17] File exists: 'ha1.log' 报错文件已存在
# f1 = open('ha3.log','x') # 文件不存在则创建,创建完成后可以直接写入内容。
# f1.write("112233")
# f1.close()
##########################
#### ( a )追加模式【不可读;不存在则创建;存在则只追加内容;】 ####
1、打开文件后,默认指针位置到最后,如果直接读,会读取不到内容,必须 seek(0)
2、如果文件存在则在后面追加内容,如果不存在则创建文件
3、即使调整了(seek)指针位置,也是在最后追加
# f = open("ha2.log",'a') # 文件中有666
# f.write("77777") # 写入文件777后,文件内容为:666777
# f.close()
###########################################################

# 以二进制(字节)方式打开

# 普通打开
# ==== python 内部将010101 =》 转换成字符串, 通过字符串操作
# 010101011 python解释器 程序员

############################################
# ##### 字节方式打开 #####

# # 1、rb,只读
# # ha.log 内容:中国
# f = open("ha.log",'rb')
# data = f.read()
# f.close()
# print(data,type(data))
# # b'xe4xb8xadxe5x9bxbd' <class 'bytes'>
# str_data = str(data,encoding='utf-8')
# print(str_data)
# # 中国
############################################

# # 2、wb,只写
# f = open('ha.log','wb')
# str_date = "中国人"
# bytes_data = bytes(str_date,encoding='utf-8')
# f.write(bytes_data)
# f.close()

# 为了方便,一般都使用字符串类型,让python解释器帮助我们进行二进制的转换

###########################################################

# # 写:写的时候,会先把指针调整到最后,然后去写。
# # 读:在关闭文件之前,指针位置会接着往后读,调整指针。
# # f.tell() # 获取当前的指针在哪里
# # f.seek(0) # 设置指针的位置
############################################################

#### 1、r+ 读写 ###
1、文件不存在则报错;FileNotFoundError: [Errno 2] No such file or directory: 'bb'
2、打开文件后指针位置默认为0
3、文件写的时候,会根据指针当前的位置向后覆盖去写,写完后指针停留在最后写的字符位置。
4、读的时候会根据当前指针位置往后读取。
with open('aa', 'r+', encoding='utf-8') as f1:
print(f1.tell()) # 0
print(f1.write('123456789')) # 9 这个9是指写入的个数
print(f1.tell()) # 9
print(f1.write('1234567')) # 7
print(f1.seek(3)) # 3
print(f1.write('abcdefg')) # 7
print(f1.read())
# 123abcdefg012345678910
print(f1.tell()) # 10
print(f1.seek(0)) # 0
print(f1.write('中国人')) # 3
print(f1.tell()) # 9
print(f1.read())
# 中国人g234567898910 # 由此看出,一个中文占据3个字符
# # 读写,
# f = open('ha.txt','r+',encoding='utf-8')
# print(f.tell()) # 0
# data = f.read()
# print(f.tell()) # 18
# print(type(data),data)
# # <class 'str'> 中国人日本人泰国人
# f.write("印度人") # 写入ha.txt文件一个印度人。
# print(f.tell()) # 27 因为写的时候会将指针调整到最后,然后去写。
# f.seek(0) # 将指针调整为 0
# data = f.read()
# print(type(data),data)
# # <class 'str'> 中国人日本人泰国人印度人
# print(f.tell()) # 36
# f.close() # 关闭文件

#####################################################
#### 2、w+ 可写读 ####
1、文件不存在则创建
2、文件存在,文件打开的时候,先清空文件内容,指针位置为0
注:非常危险
3、写入文件时,指针位置移动至写的最后一个字符处,此时读取只能读取指针往后的内容。
4、读取文件时,会根据当前指针所在位置向后读取。

  以下两个语句已经将文件aa的内容清空了。
 
 f1 = open('aa', 'w+', enconding='utf-8')
  print(f1.tell()) # 0
  with open('aa', 'w+', enconding='utf-8') as f1:
  print(f1.tell()) #0

with open('aa', 'w+', encoding='utf-8') as f1:
print(f1.tell()) # 0
print(f1.write('123456789')) # 9 这个9是指写入的个数
print(f1.tell()) # 指针位置 9
print(f1.write('1234567')) # 7
print(f1.tell()) # 指针位置 16
print(f1.seek(3)) # 将指针位置调整为3
print(f1.write('abcdefg')) # 写入abcdefg
print(f1.tell()) # 当前指针位置为 10
print(f1.read()) # 读取内容从当前指针位置开始向后读取。
# 234567
print(f1.seek(0)) # 将指针位置移动至0
print(f1.read())
# 123abcdefg234567

######################################################
#### 3、x+ 写读 ####
x+ 和w+基本上一样。额外功能如果文件存在,报错。
######################################################
#### 4、a+ 写读 ####
1、文件不存在创建文件
2、打开的同时,指针已经到最后了。如果文件中有内容就会在文件最后进行追加
3、写时,也会追加,将指针放到最后。即使调整了指针位置也会在文件最后进行追加。
4、如果文件本身有内容时,直接打开文件进行读取,是读不到的,以为指针移动到了内容最后,读是从指针位置开始的。需要seek(0)
# aa  文件初始内容为 sidaofeng
with open('aa', 'a+', encoding='utf-8') as f1:
print(f1.read()) # 没有内容,因为指针已经移动到了文件最后
f1.seek(0) # 将指针移动至0
print(f1.read()) # sidaofeng
print(f1.tell()) # 9
print(f1.write('123456789')) # 9 这个9是指写入的个数
print(f1.tell()) # 指针位置 18
print(f1.write('abc')) # 3
print(f1.tell()) # 指针位置 21
print(f1.seek(3)) # 将指针位置调整为3
print(f1.write('0.0.0.0'))
# 将0.0.0.0 写入文件,虽然指针位置为3,但是只要一执行写命令,文件指针就会先移动至内容最后,然后进行内容的写入。
print(f1.tell()) # 当前指针位置为 28
f1.seek(0)
print(f1.read()) # sidaofeng123456789abc0.0.0.0

##############################################################
# r+
# 从开始向后读
# 写,追加,指针调到最后
# w+
# 先清空所有内容
# 从开始向后读,啥都没有
# 写的时候是重新写,指针到最后

################################################################
def close(self, *args, **kwargs): # real signature unknown
        关闭文件
        pass

    def fileno(self, *args, **kwargs): # real signature unknown
        文件描述符  
        pass

    def flush(self, *args, **kwargs): # real signature unknown
        刷新文件内部缓冲区,强行刷入硬盘
        pass

    def isatty(self, *args, **kwargs): # real signature unknown
        判断文件是否是同意tty设备
        pass

    def read(self, *args, **kwargs): # real signature unknown
        默认是全读,可以指定读取字节(字符)数量,
     读取字节/字符取决于读取类型,b pass def readable(self, *args, **kwargs): # real signature unknown 是否可读 pass def readline(self, *args, **kwargs): # real signature unknown 仅读取一行数据,指针会变一行 pass      redlines: 不推荐用,因为将文件的所有行都一次添加到内存里了。
        【“第一行“,”第二行”】 def seek(self, *args, **kwargs): # real signature unknown 指定文件中指针位置 pass def seekable(self, *args, **kwargs): # real signature unknown 指针是否可操作 pass def tell(self, *args, **kwargs): # real signature unknown 获取指针位置,没有参数,直接获取指针位置 pass def truncate(self, *args, **kwargs): # real signature unknown 截断数据,仅保留指定之前数据
     依赖指针的位置 pass def writable(self, *args, **kwargs): # real signature unknown 是否可写 pass def write(self, *args, **kwargs): # real signature unknown 写内容
     str:无b,字符,需要添加 encoding=
     brys:有b,字节, pass def __getstate__(self, *args, **kwargs): # real signature unknown pass def __init__(self, *args, **kwargs): # real signature unknown pass @staticmethod # known case of __new__ def __new__(*args, **kwargs): # real signature unknown """ Create and return a new object. See help(type) for accurate signature. """ pass def __next__(self, *args, **kwargs): # real signature unknown """ Implement next(self). """ pass def __repr__(self, *args, **kwargs): # real signature unknown """ Return repr(self). """ pass

with

2.7以后可以同时打开两个文件


我的目标是每天厉害一点点
原文地址:https://www.cnblogs.com/sidaofeng/p/10102897.html