Python-文件处理

Posted OYxing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)  # 通过替换文件方式更新数据

 

  

 

以上是关于Python-文件处理的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

你如何在 python 中处理 graphql 查询和片段?

python+spark程序代码片段

我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?

15种Python片段去优化你的数据科学管道

使用 Python 代码片段编写 LaTeX 文档