python 文件操作(读写等)
简介
在实际开发中我们需要对文件做一些操作,例如读写文件、在文件中新添内容等,通常情况下,我们会使用open函数进行相关文件的操作,下面将介绍一下关于open读写的相关内容。
open()方法
open方法打开文件并返回一个文件对象,之后对文件的处理均需要基于返回的文件对象,如果文件不存在或者无法打开,则抛出OSError,详细方法如下:
open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
常用参数
file
: 需要打开的文件或者文件描述符,通常直接时文件即可
mode
:对于文件需要操作的模式,常用的如下:
字符 | 含意 |
---|---|
'r' | 读取(默认) |
'w' | 写入,并先截断文件 |
'x' | 排它性创建,如果文件已存在则失败 |
'a' | 打开文件用于写入,如果文件存在则在末尾追加 |
'b' | 二进制模式 |
't' | 文本模式(默认) |
'+' | 打开用于更新(读取与写入) |
encoding
:操作文件时的编码,如果所读文件中包含中文,最好设置为utf-8格式,否则中文读出来会是乱码;如果是读取文件的原生字节的格式,则不能设置encoding。
不常用参数
buffering
:是否采用行缓冲,0:不采用(适用于二进制模式),默认为1
默认的缓冲策略
* 二进制文件以固定大小的块进行缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”或使用 io.DEFAULT_BUFFER_SIZE。在许多系统上,缓冲区的长度通常为4096或8192字节。
* “交互式”文本文件( isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。
errors
:可选字符串参数,用于指定如何处理编码和解码错误 - 这不能在二进制模式下使用。
newline
:控制 universal newlines 模式如何生效(它仅适用于文本模式)。它可以是 None,'','\n','\r' 和 '\r\n,主要在读取流或者写入流时做处理,具体如下:
读取流时:如果newlines为None,则启用通用的换行模式,也可以使用其他可选参数
写入流时: 如果newlines为None,则会默认将\n转换为系统分隔符(os.linesep),如果不为None,则使用给定字符串
closefd
:关闭文件描述符(只在file为文件描述符
的情况下生效,否则会报错),默认为True,关闭文件描述符,当为False时,文件描述符在操作时会出现,文件关闭后,对应的文件描述符不会关闭。
opener
:自定义开启器,注意必须要返回一个文件描述符,正常默认为None即可,详单与os.open() as opener
返回的文件对象的操作
open方法返回了一个文件对象,其实就是IO对象,我们需要知道IO对象中部分方法或者函数。
读取内容
read(size)
: 读取内容,按照size的大小读取内容,可能会出现裁切的情况,当文件足够大时,size的大小决定了程序占用内存的大小,建议不要太大。readable()
:是否可以读取流,可以则返回True,反之为False,当为False时则无法读取文件流内容。readline(size=- 1)
:一行一行读取,可以设置size大小,代表最多读取的大小,主要是对于一些异常情况,例如一行有比较长的字符的时候readlines(hint=- 1)
:读取整个文件的内容并安装换行符进行输出,返回一个列表,hint可以指定读取的行数。官方建议,如果可以使用 for line in file,就不需要使用for line in file.readlines()
写入内容
writable()
:是否可以写入流,可以则返回True,反之为False,当为False时无法写入文件。writelines(lines)
: 写入多行数据,传入的是序列,默认会在每一个序列中的元素后添加换行write(line: str)
:写入单行数据,传入的字符串
其他
isatty()
: 如果流是交互式的(即连接到终端/tty设备),则返回 Truefileno()
: 返回流的底层文件描述符(整数)---如果存在。如果 IO 对象不使用文件描述符,则会引发 OSError 。tell()
:返回当前流的位置。与seek()中位置类似。需要注意的是,想要获取正确的位置,不能使用如下方式进行操作,会出现下方问题。with open(file_path, mode="r") as f:
for line in f:
print(line)
print(f.tell()) OSError: telling position disabled by next() call
需要使用readline逐行读取
with open(file_path, mode="r") as f:
while True:
line = f.readline()
print(line)
if not line:
break
print(f.tell())
seekable()
:如果流支持随机访问则返回 True。 如为 False,则 seek(), tell() 和 truncate() 将引发 OSError。seek(offset, whence=SEEK_SET)
:将流位置修改到给定的字节 offset。 offset 将相对于由 whence 指定的位置进行解析。 whence 的默认值为 SEEK_SET。 需要注意的是seek的偏移量是相对于字符的,不是相对于行数的,whence 的可用值有:SEEK_SET 或 0 -- 流的开头(默认值);offset 应为零或正值
SEEK_CUR or 1 -- 当前流位置;offset 可以为负值
SEEK_END or 2 -- 流的末尾;offset 通常为负值
fileno()
:返回流的底层文件描述符(整数)---如果存在。如果 IO 对象不使用文件描述符,则会引发 OSError 。flush()
:刷新流的写入缓冲区(如果适用)。因为某些情况下,在写入时会首先写入到缓冲区,为了保证数据全部写入,可以手动调用flush,这对只读和非阻塞流不起作用。
返回新的绝对位置。truncate(size=None)
:将流的大小调整为给定的 size 个字节(如果未指定 size 则调整至当前位置)。 当前的流位置不变。 这个调整操作可扩展或减小当前文件大小。 在扩展的情况下,新文件区域的内容取决于具体平台(在大多数系统上,额外的字节会填充为零)。 返回新的文件大小。在 3.5 版更改: 现在Windows在扩展时将文件填充为零。close()
: 刷新并关闭此流。如果文件已经关闭,则此方法无效。文件关闭后,对文件的任何操作(例如读取或写入)都会引发 ValueError 。为方便起见,允许多次调用此方法。但是,只有第一个调用才会生效。closed
:如果流已关闭,则返回 True。
操作文件常用函数
复制一个文件的内容到另一个文件
with open(file_path, mode="r", encoding="utf-8") as f, open(
file_path2, mode="w", encoding="utf8"
) as w_f:
for line in f:
print(line)
w_f.write(line)
获取对应行的位置
with open(file_path, mode="r") as f:
while True:
line = f.readline()
print(line)
if not line:
break
print(f.tell())
替换一个文件中的部分内容
在文件中的部分内容周围添加内容
假设存在test.cpp,我们需要在#include
前后添加相应的内容,替换内容均为add_test.
/**
* @file test.cpp
*
*/
#include <glog/logging.h>
int main(int argc, char *argv[])
{
google::InitGoogleLogging(argv[0]);
FLAGS_alsologtostderr = true;
LOG(INFO) << "------conan test-----------------";
google::ShutdownGoogleLogging();
return 0;
}
import pathlib
from pathlib import Path
def content_before_add(file_path: Path, add_content: str):
"""add before content
Args:
file_path (Path): file to be operated
add_content (str): What needs to be added
"""
new_file_path = file_path.parent.joinpath(file_path.name + ".bak")
with open(file_path, mode="r", encoding="utf-8") as r_f, open(
new_file_path, mode="w", encoding="utf-8"
) as w_f:
old_index = -1
for line in r_f:
w_f.write(line)
if line.strip().startswith("#"):
w_f.seek(old_index)
w_f.write(add_content + "\n" + line)
old_index = w_f.tell()
new_file_path.replace(file_path)
def content_after_add(file_path: Path, add_content: str):
"""add after content
Args:
file_path (Path): file to be operated
add_content (str): What needs to be added
"""
new_file_path = file_path.parent.joinpath(file_path.name + ".bak")
with open(file_path, mode="r", encoding="utf-8") as r_f, open(
new_file_path, mode="w", encoding="utf-8"
) as w_f:
for line in r_f:
w_f.write(line)
if line.strip().startswith("#"):
w_f.write(add_content + "\n")
new_file_path.replace(file_path)
替换后内容如下:
/**
* @file test.cpp
*
*/
add_test
#include <glog/logging.h>
int main(int argc, char *argv[])
{
google::InitGoogleLogging(argv[0]);
FLAGS_alsologtostderr = true;
LOG(INFO) << "------conan test-----------------";
google::ShutdownGoogleLogging();
return 0;
}
大文件的读取
注意事项
1.需要注意对于文件操作时候的模式,w
默认会覆盖文件, a
默认会追加文件中的内容。
参考
python 官方文档 open
python官方文档 io
python 文件操作(读写等)的更多相关文章
- Python文件操作——读写图片,音频,视频
注意:其实就是将mode="rb"或者mode="wb",因为图片,视频,音频就是二进制进行读取,b 代表binary ,其他的和一般文件操作步骤一样,另外, ...
- Python基础篇【第2篇】: Python文件操作
Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...
- [Python学习笔记][第七章Python文件操作]
2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...
- 初学Python——文件操作第二篇
前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...
- day8.python文件操作
打开和关闭文件 open函数 用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写. file = open(file_name [, access_ ...
- 关于python 文件操作os.fdopen(), os.close(), tempfile.mkstemp()
嗯.最近在弄的东西也跟这个有关系,由于c基础渣渣.现在基本上都忘记得差不多的情况下,是需要花点功夫才能弄明白. 每个语言都有相关的文件操作. 今天在flask 的例子里看到这样一句话.拉开了文件操作折 ...
- Python之路Python文件操作
Python之路Python文件操作 一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r&qu ...
- python 文件操作 r w a
python基础-文件操作 一.文件操作 对文件操作的流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 打开文件时,需要指定文件路径和以何等方式打开文件, ...
- Python:文件操作技巧(File operation)(转)
Python:文件操作技巧(File operation) 读写文件 # ! /usr/bin/python # -*- coding: utf8 -*- spath = " D:/dow ...
- 小学生都能学会的python(文件操作)
小学生都能学会的python(文件操作) 1. open("文件路径", mode="模式", encoding="编码") 文件的路径: ...
随机推荐
- 数据管理技术发展,数据库应用发展史,数据库分类,MySQL
计算机数据管理技术发展 1. 自由管理阶段 用户以文件形式将数据组织起来,并附属在各自的应用程序下. 1.数据不保存 当时计算机主要用于科学计算,一般不需要将数据长期保存,只是计算某一课 ...
- 关于扑克牌的一些讨论——《Fluent Python 2》读书笔记
一.说明 参考资料为维基百科的 Playing Card 词条,非严肃性论证,只是对代码为什么这么写做讨论. 二.扑克牌的起源 import collections Card = collection ...
- 《Mybatis 手撸专栏》第8章:把反射用到出神入化
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么,读不懂框架源码? 我们都知道作为一个程序员,如果想学习到更深层次的技术,就需 ...
- 论文解读《Bilinear Graph Neural Network with Neighbor Interactions》
论文信息 论文标题:Bilinear Graph Neural Network with Neighbor Interactions论文作者:Hongmin Zhu, Fuli Feng, Xiang ...
- 274. H-Index - LeetCode
Question 274. H-Index Solution 题目大意: 论文里的 h 因子判定,题目的意思可能有点晦涩.h 因子是评判学术成就的一种重要方法,h 因子越高越好,h 因子兼顾研究学术人 ...
- [codeforces] 暑期训练之打卡题(一)
每个标题都做了题目原网址的超链接 Day1<Vanya and Lanterns> 题意: 一条长度为 l 的街道,在这条街道上放置了n个相同的灯,街道一端位置记为0,每个灯的位置在ai处 ...
- MongoDB 常用启动参数
每日一句 Once you choose your way of life, be brave to stick it out and never return. 生活的道路一旦选定,就要勇敢地走到底 ...
- 「ABC 249Ex」Dye Color
考虑停时定理. 初始势能为 \(\sum \Phi(cnt_i)\),末势能为 \(\Phi(n)\),我们希望构造这样一个 \(\Phi:Z\to Z\) 函数,使得每一次操作期望势能变化量为常数. ...
- 绿色城市智慧运营:Web 3D 垃圾分类 GIS 系统
前言 感谢所有为上海疫情奉献的人,祈求上海疫情早日清零,中国加油,上海加油! <上海市生活垃圾管理条例>施行至今已有两年多,上海市民践行绿色低碳理念.主动参与生活垃圾分类的习惯基本养成,分 ...
- PostMan 快快走开, ApiFox 来了, ApiFox 强大的Api调用工具
简介 为什么要用ApiFox呢, 一般现在程序员开发测试, 一般都是PostMan, PostWoman等Api调用工具, 我之前也是一直在用, 但是今天我发现了一款相比于Postman更加好用的工具 ...