首页 > 技术文章 > python文件处理

ajaxa 2018-04-28 12:14 原文

#写和读取时候,所有的数据只能是字符串,不能是数字或者其他内容

#新建一个文件;冰倩写入文件内容为:这是一个新的文件内容
f = open('a.txt',"w",encoding="utf8")
f.write("这是一个新的文件内容\n")   #写入操作 \n回车换行
f.write("这是一个新的文件内容\n")   #写入操作
f.writelines(['111\n','222\n'])   #列表方式写入多行
print(f.writable())  # 判断是否可写
f.close()



#打开文件,读取文件内容,不写'r',默认是只读模式
r = open("a.txt",'r',encoding="utf8")
data = r.read()  #读取全部内容
print(data)
print(r.readable())  #判断文件是否只读
print(r.readline())  #一次读一行内容,下一行内容可以在接着运行readline,默认最后一行内容有个回车,会有换行的情况
print(r.readline(),end="") #去掉最后的回车
print(r.readlines()) #读取所有的内容,把每行的内容放到一个列表中,默认最后一行有空格
r.close()


#追加
f = open('a.txt',"a",encoding="utf8")
f.write("这是追加的内容\n")
f.close()

#r+ 既能读又能写
# f = open('a.txt',"r+",encoding="utf8")
# f.write("这是r+的内容\n")  #默认第一行开始写入,把存在的内容直接按顺序覆盖修改
# f.close()



#打开不用关闭文件 用with就可以,自动会关闭文件
with open('a.txt','r',encoding="utf8") as f:
    data = f.read()
    print(data)


# str ---- > encoding(编码) ----->bytes
# btyes ---> encode(解码) ------->str

#open模式
'''
不填写默认     'r'       open for reading (default)
         'w'       open for writing, truncating the file first
         'x'       create a new file and open it for writing
         'a'       open for writing, appending to the end of the file if it exists
         'b'       binary mode
不填写默认     't'       text mode (default)
         '+'       open a disk file for updating (reading and writing)
         'U'       universal newline mode (deprecated)

'''

#b模式就是二进制的方式:
#
f = open('二进制文件','wb')  # wb 二进制方式写入文件,二进制文件没有编码,只有解码
#f.write('1111,你好')         #报错 TypeError: a bytes-like object is required, not 'str' 二进制文件写入,需要以二进制的方式,不能直接把str写到里面
#处理方式:  可以先把字符串转换成二进制的方式在写入
#字符串转二进制过程(编码):
test = bytes('1111,你好',encoding="utf-8")   #bytes 和 '1111,你好'.encode="utf-8  编码都是一样的;一个是bytes方法  一个是字符串自己提供的一个方法
f.write(test)



#
f = open('二进制文件','rb')   #二进制的方式读取文件
data = f.read()
print(data)                  #b'1111,\xe4\xbd\xa0\xe5\xa5\xbd'读取的是二进制的文件,所以需要解码成字符串.
#二进制转字符串过程(解码):
print(data.decode('utf-8'))  #解码后:1111,你好




'''一: read(3):文件打开方式为文本模式时,代表读取3个字符;文件打开方式为b模式时,代表读取3个字节
                其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
'''


f = open('二进制文件','r+',encoding="utf-8")
'''
二进制文件内容如下:
你好
'''

f.readline()
print(f.tell())   #tell光标当前所在位置等于8  为什么是8 因为"你好" 一个中文为3个字节加上win平台的默认回车为"\r\n" 所以为8
f.seek(1)         #seek光标跳到第1个字节位置
print(f.tell())
f.truncate(3)    #从开始算,将文件安只保留从0-3个字节的内容
#seek 高级模式
f.seek(10,0)  #0是默认;不写就是默认0;从文件开始数10个位置
f.seek(10,1)  #1相对位置,就是上一次位置,在数10个位置,这个需要b模式打开文件,不然报错
f.seek(-10,2)  #2倒序,就是倒着读取,在数-10个位置,这个需要b模式打开文件,不然报错

f.close()

#显示win平台的默认回车;newline以最原始的方式显示换行符
f = open('二进制文件','r+',encoding="utf-8",newline='')
data = f.readlines()
print(data)       #['你好\r\n', '1111']   #newline效果就显示\r\n;  不加newline默认情况下是['你好\n', '1111']少一个\r是因为python给你优化掉了

 

推荐阅读