文件操作

假设程序执行当前文件夹下存在test.txt

this is line 1
this is line 2
this is line 3
this is line 4
this is line 5
this is line 6
this is line 7
this is line 8
this is line 9

2.文本只读操作

f = open("test.txt", "r", encoding="utf8")
# 注意:每读取一定数据,游标就移动到相应的位置

charge = f.readable() # 判断文件是否可读
data = f.read()        # 一次性读取所有数据
data = f.readline()   # 读取一行信息
data = f.readlines()    # 将所有的内容弄成一个列表,每行的内容为一个元素

f.close() # 使用完毕要关闭文件句柄,释放系统资源
print(data)

3.文本只写操作

”w”模式会将存在的文件清空再操作,不存在就新建
w 很危险,存在的文件一执行就会覆盖,慎重!

f=open('test.txt','w',encoding='utf8')  #

f.writable()   # 判断是否可写

f.write('11111111\n')
f.writelines(['555\n','6666\n'])  # 参数是一个列表,列表里面的元素只能为字符串

f.close()

4.文本只追加操作

f=open('test.txt','a',encoding='utf-8')  # 追加方式,游标直接指向末尾
f.write('我写到文件最后')


5.文本+模式操作

f=open('test.txt','r+',encoding='utf-8')  # 读写操作,打开时游标指向开头
f.write('123sb')  # 打开后直接写,指针指向开头,会覆盖原来的对应字节的内容
data=f.read()
print(data)
f.write('123sb')   # 经过读操作,指针指向末尾,写为追加到最后


f=open('test.txt','w+',encoding='utf-8') # 只要存在 w 先清空,后操作!
f.close()



f=open('test.txt','a+',encoding='utf-8') # 追加读写,游标默认在文件尾
f.write("dfadf sdafa")


6.binary操作文件模式

注意:

  • 文件打开默认为文本方式
  • binary操作模式不能指定字符编码,因为是二进制,所以不需要编码
  • window平台回车是\r\n ; unix linux 为\n \x开头表示
  • 为十六进制

'字符串'---------encode--------->bytes
'字符串'<--------decode----------bytes

# 以二进制读文件,然后进行解码
f=open('test.txt','rb')
data=f.read()
print(data)
print(data.decode('utf-8'))
f.close()


# 以二进制方式写文件,指定转换为对应编码的二进制
f=open('test.txt','wb')
f.write(bytes('1111\n',encoding='utf-8'))
f.write('杨件'.encode('utf-8'))
f.close()

# 二进制方式追加,将内容编码后追加到文件最后
f=open('test22.py','ab')
f.write('杨件'.encode('utf-8'))
f.close()

# 不知道编码的情况下,latin-1会尽可能多的还原
f=open('test.txt','r+',encoding='latin-1')
data=f.read()
print(data)
f.write('aaaaaaaaaaa')

# newline='' 读取文件中真正的换行符号(由于平台的不同,py3处理了一下)
# win\r\n <---> \n unix/linux
f=open('test.txt','r',encoding='utf-8',newline='')
data = f.read().encode("utf8")
print(data) # b'1\r\n2'
f.close()

f=open('test.txt','r',encoding='utf-8')
data = f.read().encode("utf8")
print(data) # b'1\n2'
f.close()


# 判断文件是否关闭了
f = open('test.txt','r',encoding='utf-8')
print(f.closed)
f.close()

# 查看打开文件所用的编码方式
f=open('test.txt','r',encoding='gbk')
print(f.encoding) # gbk
f.close()


# 刷新,将内存里面的东西保存在文件中
f = open("test.txt","ab+")
data = b"adfaeadfjiefka"
f.write(data)
f.flush() # 刷新
f.close()

光标操作

# f.tell() 告诉当前游标的位置,以字节为单位
f = open("test.txt","rb")
f.readline()
print(f.tell())
f.close()


# f.seek() 用于控制光标的移动(字节为单位)
f = open("test.txt","rb+")
f.readline()
f.seek(3)  # 相对于0的位置进行移动
f.seek(10,1)  # 参数 1 为,相对于上一次光标移动的位置(b的方式),可正可负
f.seek(-5,2)   #相对于文件末尾,参数2,必须为负数
print(f.read().decode('utf8'))
f.close()

# f.read(n) #以字符为单位读取文件
f = open("test.txt","r")
print(f.read(4))
f.close()

# f.truncate((n) # 以字节为单位截取文件,必须存在写模式才能如此操作
f = open("test.txt","rb+")
f.truncate(3)
f.close()

读取大文件的方法

方式一:

f=open('test.txt','rb')  # 这个效率低
lis = f.readlines()
data = lis[len(lis) - 1]
print(data)

方式二:

offset = -4
data_lis = None
with open("test.txt" ,"rb") as f:
    while True:
        f.seek(offset,2)
        data_lis = f.readlines()
        if len(data_lis) > 1:
            break
        else:
            offset *= 2

print(data_lis[1].decode("utf8"))

7.with的使用

with关键字,可以省去close()操作,with块结束后会自动调用close

with open('a.txt','w') as f:
    f.write('1111\n')

with open('test.txt','r',encoding='gbk') as src_f,\    # \ 为python中代码换行的标志
        open('xxx_new','w',encoding='gbk') as dst_f:   # with可以同时打开多个操作
    data=src_f.read()
    dst_f.write(data)

补充:第三方智能检测字符编码工具chardet,能最大限度的识别字符的编码方式

需要在线安装:

pip install chardet

result = chardet.detect(open("log",mode="rb").read())
print(result)


posted @ 2018-07-22 20:36  哈哈大圣  阅读(134)  评论(0编辑  收藏  举报