Python-文件处理

一、文件操作的流程

  1.打开文件

  2.对文件进行操作(读、写、改)

  3.关闭文件

#1.带编码方式读文件
f = open(file='D:/文件操作.txt', mode='r', encoding='gbk')  # 找到并以只读模式打开文件
data = f.read()    # 读取文件并存在内存上
print(data)       # 打印读取的文件
f.close()         # 关闭文件

#2.未知编码方式时二进制只读
f = open(file='D:/文件操作.txt', mode='rb')  # 找到并以只读模式打开文件,以默认的gbk的编码方式读取文件
data = f.read()    # 读取文件并存在内存上
print(type(data), data)       # 打印读取的文件
data2 = data.decode('gbk')  # 需要手动decode 才能显示文本
print(data2)
f.close()         # 关闭文件

二、基本操作

1.文件打开方式

   f=open('路径',‘模式’)        #1.文件路径       2.什么方式打开文件。

 2. 打开模式:  

  r ——只读模式——》默认模式——》文件必须存在    ——》不存在程序报错

  w——只写模式—— 》 不可读  ——》存在则清空内容——》不存在则创建

  a——追加模式  ——》可读      ——》 存在则只追加内容——》不存在则创建

  r+——读写模式——》先读完文件,追加到文件后面

  w+——写读模式——》先清空文件,再写新的东西

三、读文件

  1.带编码方式读

  2.不带编码方式读

  3.不知道文件编码方式怎么办?

    用chardet包

import chardet

f = open('D:/文件操作.txt', mode='rb')  # 未知文件格式,先通过读二进制方式读取
data = f.read()         # 读取数据放到内存中
result = chardet.detect(data)  # 通过char det方法检测编码方式
print(result)
f.close()

output:

  4.循环文件

f = open(file='D:/文件操作.txt', mode='r', encoding='gbk')  # 找到并以只读模式打开文件
for line in f:
    print(line.strip())       # 一次取一行打印,由于print会自动换行,所以去除一下空格
f.close()

四、写文件

#1.指定编码方式写操作
f = open('D:/文件操作1.txt', mode='w', encoding='utf-8')
f.write('crm')  # 写入字符串
f.close()       # 关闭文件

#2.二进制方式写操作
f = open('D:/文件操作2.txt', mode='wb')
f.write('crm'.encode('utf-8'))  # 写入字符串
f.close()       # 关闭文件b

五、追加

#1.mode='a'追加操作
f = open('D:/文件操作1.txt', mode='a', encoding='utf-8')
f.write('hahaha')  # 写入字符串
f.close()       # 关闭文件

#2.mode='ab'二进制方式追加操作
f = open('D:/文件操作2.txt', mode='ab')
f.write('hahaha2'.encode('utf-8'))  # 写入字符串
f.close()       

六、读写模式

f = open('D:/文件操作1.txt', mode='r+', encoding='utf-8')
data = f.read()
print(data)
f.write('\n这是r+的操作')
f.close()

输出:

 七、写读模式(略:没什么用)

八、文件操作标准化函数:

# def fileno(self, *args, **kwargs): # real signature unknown
# 返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到
#def flush(self, *args, **kwargs): # real signature unknown
# 把文件从内存buffer里强制刷新到硬盘

 

#flush用法
f = open('f_flush_test.txt', 'w')
f.write('abcde')
f.flush()     # 把内存内容强制刷入硬盘
print(f.readable())  # 判断是否可读,写操作不可读
f.close()
View Code

# def readline(self, *args, **kwargs): # real signature unknown
# 只读一行,遇到\r or \n为止

 

#readline用法
f = open('D:/文件操作.txt', 'r')
data = f.readline()    # 每次读一行,遇到\n或\r停止
print(data)
f.close()
View Code

 

# def readable(self, *args, **kwargs): # real signature unknown
# 判断是否可读

 

# def writable(self, *args, **kwargs): # real signature unknown
# 判断文件是否可写

 

# def seekable(self, *args, **kwargs): # real signature unknown
# 判断文件是否可进行seek操作

 

# #readable writable seekable 用法
f = open('f_flush_test.txt', 'r')
#f = open('D:/文件操作.txt', 'r')
print('read(1)操作', f.read(1))      # 读一个字符
print('read()操作', f.read())      # 此时光标已经在第一个字符,把光标所在之后的内容读入内存
print('readable()操作', f.readable())   # 判断是否可读,写操作不可读
print('writable()操作', f.writable())   # 判断是否可写,读操作不可写
print('seekable()操作', f.seekable())   # 判断光标是否可移动
f.close()
View Code

 

# def seek(self, *args, **kwargs): # real signature unknown
# 把操作文件的光标移到指定位置

# def tell(self, *args, **kwargs): # real signature unknown
# 返回当前文件操作光标位置

# def truncate(self, *args, **kwargs): # real signature unknown
# 按指定长度截断文件
# *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。

 九、修改文件

  1、占内存、不占硬盘——全部读到内存再改

#方法1:
#    1.把文本文件整体读进内存。
#    2.通过s.repalce(old,new)把匹配的字符串替换。
#    3.关闭文本文件。
OLD_STR = '哈哈'
NEW_STR = '改了'

file = 'D:\文件操作.txt'

f = open(file, 'r+', encoding='gbk') # 打开文件
str = f.read()    # 读取文件到内存
str2 = str.replace(OLD_STR, NEW_STR)
print(str2)
f.close()

 

  2、占硬盘、不占内存——边读边改

#方法1:
#    1.把文本文件整体读进内存。
#    2.通过遍历的方法,把匹配的字符串替换。
#    3.关闭文本文件。

import os

OLD_STR = '哈哈'
NEW_STR = '改了'

file = 'D:\文件操作.txt'
file_new = '%s.new' % file
f_new = open(file_new, 'w',)
f = open(file, 'r', encoding='gbk')  # 打开文件
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(file_new, file)  # 通过替换文件方式更新数据

 

  

 

posted @ 2018-03-21 21:23  OYxing  阅读(219)  评论(0编辑  收藏  举报