1、打开与关闭

1.1、open() close()
我们使用 open() 函数打开文件。这个函数将返回一个文件对象,我们对文件的读写都将使用这个对象。
open() 函数需要三个参数,第一个参数是文件路径或文件名,第二个是文件的打开模式,第三个是编码格式。模式通常是下面这样的:
"r",以只读模式打开,按字符读,也就是rt模式
"w",以写入模式打开,如果文件存在将会清空所有内容,然后写入
"a",以追加模式打开,写入到文件中的任何数据将自动添加到末尾
"b",以二进制的方式打开
r+:读文件并在文件最后进行追加内容
w+:文件有可读可写权限
rb:以二进制格式进行读,可用于在网络中传输。例如从gbk的windows系统中传递utf-8的linux系统就不需要编码了,直接解码就可以,效率上和r没啥区别,按字节读
wb:以二进制格式进行写,并且需要指定编码格式
如果用二进制方法读写,就不需要指定编码格式了
默认的模式为只读模式,也就是说如果你不提供任何模式,open()函数将会以只读模式打开文件。

f = open('1.txt', 'wb')
f这个变量称为文件句柄,一般命名为f,f1,fh,file_handle等。

坑:
当文件路径是'C:\Users\i\Desktop\1.txt'时会报错
原因:文件路径中含有\n、\U、\t时会认为是一个转义符
解决方法:1、推荐路径前加r,写成r'C:\Users\i\Desktop\1.txt'
             2、再加一个\,写成'C:\\Users\i\Desktop\1.txt'
                  3、\换成/

f.tell() 显示光标目前所在的位置,按字节计算,不是字符
f.seek(20)按字节查找,光标从第20个字节开始,其中1个汉字占3个字节
f.truncate(100)截取从文档最开始到第100个字符串,且只能从最头开始截取不能从中间截取,且只能以a或r+模式打开文件
f.flush()强制刷新硬盘,例如在f.write('1')时如果没有f.close()则不会立刻写入硬盘,这时可以使用flush()方法强制写入硬盘,一般用于日志实时显示时用。

f.seek(参数1, 参数2): 参数1表示移动几个字节(注意不是字符),参数2表示参照物(0表示文件开头,1表示当前光标位置,2表示文件结尾)

当程序执行结束后,我们需要关闭文件,如果不关闭会持续占用一些内存和操作系统资源,不关闭的文件也有可能造成数据丢失。

我们使用方法 close() 完成这个操作,重复关闭不会有任何影响:
file.close()

1.2 with语句
在实际情况中,我们应该尝试使用 with 语句处理文件对象,它会在文件用完后会自动关闭,就算发生异常也没关系。它是 try-finally 块的简写:

 with open('/etc/protocols') as file:
count = 0
for line in file:
count += 1
print(count)

结果为:158
这个程序中我们将打印文件的行数,可以看到代码块中并没有使用 close,但当代码执行到 with 代码块之外时,文件会被自动关闭。

2、读取文件内容(read()、read(n)、readline()、readlines()、for循环)

此处我们创建一个文件test.txt,这个文件的内容包括两行:
Hello
I love Python

2.1、read()
使用read()可以一次性读取整个文件的内容到字符串:

 f1 = open('1.txt',encoding='utf-8', mode='r') #这里1.txt和python程序在同一个路径下,所以只写了相对路径
content = f1.read()
print(content)
f1.close()

结果为:
Hello
I love Python

当然也可以使用 with,避免忘记了 close:

 filename = '/home/test.txt'
with open(filename) as file:
file.read()

2.2、read(size)
read(size)有一个可选的参数size,用于指定字符长度,不是字节长度。如果没有指定size或者指定为负数,就会读取并返回整个文件。当文件大小为当前机器内存两倍时,就会产生问题。反之,会尽可能按比较大的size读取和返回数据。

 f1 = open('1.txt',encoding='utf-8', mode='r')
content = f1.read(10)
print(content)
f1.close()

结果为:
Hello
I l

项目开发中,我们需要谨慎使用read()读取整个文件,因为有可能你的系统内存并不足够存储整个文件的内容。当read()执行后,再次执行将不会有任何内容的输出。

2.3、readline()
在处理文本文件的时候,我们通常会采用逐行处理,readline()就是用来每次读取文件的一行

 filename = '1.txt'
f1 = open(filename,encoding='utf-8', mode='r')
content = f1.readline()
print(content)
content = f1.readline()
print(content)
f1.close()

结果为:
Hello

I love Python

2.4、readlines()
readlines()可以读取所有行,但不同于read(),这个函数的返回的是一个列表,列表中每个元素都是对应文本文件中一行内容的字符串:

 filename = '1.txt'
f1 = open(filename,encoding='utf-8')
content = f1.readlines()
print(content)
f1.close()

['\ufeffHello\n', 'I love Python']

-------------------------------------------------------
延伸
1、发现读txt文件时最前面多了一个ufeff,当编码格式改成utf-8-sig时就正常
f1 = open(filename,encoding='utf-8-sig')

utf-8与utf-8-sig两种编码格式的区别:
As UTF-8 is an 8-bit encoding no BOM is required and anyU+FEFF character in the decoded Unicode string (even if it’s the firstcharacter) is treated as a ZERO WIDTH NO-BREAK SPACE.
UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序的问题,也因此它实际上并不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。

2、打开文件时with open(filename, mode='r', encodint='utf-8) as f1:
如果打开文件的方式写在filename后可以省略mode=,直接写'r'或'w',如果写在编码格式后面,就不能简写了,必须写成mode='r'

--------------------------------------------------------
2.5、for循环遍历文件句柄
你可以for循环遍历文件句柄来读取文件中的每一行

 filename = '1.txt'
f1 = open(filename,encoding='utf-8')
content = f1.readlines()
for i in content:
print(i, end='')
或print(i.strip())
f1.close()

结果为:
Hello
I love Python

read() readline() readlines()的区别
read()是以字符串形式显示所有内容
readline()是以字符串形式每次显示一行内容,运行多次可逐行显示
readlines()是以列表的形式显示所有内容

对于大文件推荐用for循环读文件,例子:
写一个程序,这个程序接受用户输入的字符串作为将要读取的文件的文件名,并且在屏幕上打印文件行数和文件内容:

 filename = input("Enter the file name: ")
with open(filename) as file:
count = 0
for line in file:
count += 1
print(line)
print('Lines:', count)

运行程序:
Enter the file name: /home/test.txt
Hello World
I love Python
Lines: 2

3、写入文件

3.1、mode='w'写入模式
最常用的写入文件的方法是 write(),通过write()方法打开一个文件然后我们随便写入一些文本。

 filename = '1.txt'
with open(filename, encoding='utf-8',mode='w') as file:
file.write('testline1')
file.write('testline2')

这个程序中,我们将文件以'w'模式打开,然后写入两段内容。
['testline1testline2']

这时候发现文件中原来的内容已经被完全覆盖了,并且写入的内容占了一行(因为没有写入换行符的原因)。
可见w这种模式是将文件先清空,再写入
如果文件不存在,会先创建空文件,再写入

3.2、mode='a'追加模式
如果我们想向文件中增加内容如何操作呢?可以使用 'a' 追加模式打开文件:

 filename = '/home/shiyanlou/test.txt'
with open(filename, mode='a') as file:
file.write('testline3')
file.write('testline4')

再次读取,可以看到新增加的字符串附加到了原来的内容后面:
['testline1testline2testline3testline4']

 with open(filename,mode='a') as file:
file.write(str+'\n')

在写入参数str后加“\n”则会在每次完成写入后,自动换行到下一行,下次写入时便会在下一行写入

4、例子

例子1:更改文件中的内容,将haha改为Python

 import os
file = 'G:/python/1.txt'
file_new = 'G:/python/1_new.txt' with open(file,mode='r',encoding='utf-8') as f:
with open(file_new,mode='w',encoding='utf-8') as f_new:
for line in f:
if 'haha' in line:
line = line.replace('haha','Python')
f_new.write(line) os.remove('G:/python/1.txt')
os.rename('G:/python/1_new.txt','G:/python/1.txt')

同时打开两个文件可以写成

 with open(file,mode='r',encoding='utf-8') as f,open(file_new,mode='w',encoding='utf-8') as f_new:

或写成

 with open(file,mode='r',encoding='utf-8') as f,\
2     open(file_new,mode='w',encoding='utf-8') as f_new:

如果想要拷贝一个图片或音视频文件,就需要用二进制方法打开,用rb和wb

 with open('1.jpg', 'rb') as file_1:
with open('2.jpg', 'wb') as file_2:
for i in file_1:
file_2.write(i)

例子2 :利用命令行参数进行操作

 import sys,os
file = sys.argv[1]
old_str = sys.argv[2]
new_str = sys.argv[3]
new_file = 'g:/python/1_new.txt'
with open(file,mode='r',encoding='utf-8') as f,open(new_file,mode='w',encoding='utf-8') as f_new:
for line in f:
if old_str in line:
line = line.replace(old_str,new_str)
f_new.write(line)
os.remove(file)
os.rename(new_file,file)

在命令行里输入:
python test.py g:/python/1.txt Python haha
将Python替换成haha

获取sys.args的第2个参数和第3个参数也可以写成下面这样:

_, old_str, new_str = sys.argv

例子3:实现tail -f的效果

通过代码实现tail -f access.log不断读取文件更新内容的效果

 import time
with open('access.log', 'rb') as f:
f.seek(0,2) #将光标移动到文件末尾
while True:
line = f.readline()
if line:
print(line.decode(), end='')
else:
time.sleep(0.05)

必须用二进制b的模式打开,因为seek的第二个参数如果

  • 为0时(文件开头为参照点),可以用r或rb模式
  • 为1(当前光标位置为参照点)或2(文件末尾为参照点)时,用r模式打开会报错,必须用rb模式打开
  • r模式默认就是rt模式,也就是用文本模式打开

5、os.path 文件与文件夹操作

在这里简单介绍下 os.path 这个非常常用的标准库,这个库主要的用途是获取和处理文件及文件夹属性。
下面代码举例介绍几个常用的方法,更多的内容在使用到的时候查阅文档。

os.path.abspath(path) 返回文件的绝对路径
os.path.basename(path) 返回文件名
os.path.dirname(path) 返回文件路径
os.path.isfile(path) 判断路径是否为文件
os.path.isdir(path) 判断路径是否为目录
os.path.exists(path) 判断路径是否存在
os.path.join(path1[, path2[, ...]]) 把目录和文件名合成一个路径

实验代码内容,需要在 Python 交互环境中操作:
需要先导入os模块
>>> import os
>>> filename = '/home/1/test.txt'
>>> os.path.abspath(filename)
'/home/1/test.txt'x
>>>
>>> os.path.basename(filename)
'test.txt'
>>> os.path.dirname(filename)
'/home/1'
>>>
>>> os.path.isfile(filename)
True
>>>
>>> os.path.isdir(filename)
False
>>> os.path.exists(filename)
True
>>> os.path.join('/home/1', 'test.txt')
'/home/1/test.txt'
>>>

day13-文件操作的更多相关文章

  1. 【.NET深呼吸】Zip文件操作(1):创建和读取zip文档

    .net的IO操作支持对zip文件的创建.读写和更新.使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办. 要对zip文件进行操作,主要用到以下三个类: 1.ZipFile ...

  2. 野路子出身PowerShell 文件操作实用功能

    本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ...

  3. Node基础篇(文件操作)

    文件操作 相关模块 Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包 fs: 基础的文件操作 API path: 提供和路径相关的操作 ...

  4. 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)

    ========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ...

  5. SQL Server附加数据库报错:无法打开物理文件,操作系统错误5

    问题描述:      附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf ...

  6. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  7. Linux文件操作的主要接口API及相关细节

    操作系统API: 1.API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用,应用层程序通过调用API来调用操作系统中的各种功能,来干活 文件操作的一般步骤: 1.在linux系统 ...

  8. C语言的fopen函数(文件操作/读写)

    头文件:#include <stdio.h> fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:    FILE * fopen(const char * path, c ...

  9. Python的文件操作

    文件操作,顾名思义,就是对磁盘上已经存在的文件进行各种操作,文本文件就是读和写. 1. 文件的操作流程 (1)打开文件,得到文件句柄并赋值给一个变量 (2)通过句柄对文件进行操作 (3)关闭文件 现有 ...

  10. python 文件操作(转)

    python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...

随机推荐

  1. Apollo分布式配置中心部署以及使用

    一.简介Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场 ...

  2. [UE4]蓝图中清空变量值或设置为null

    不赋值就会被设置为null了. 对象是否可使用,也可以这样判断

  3. [UE4]机器人射击逻辑行为树

    1.寻找敌人 2.如果没有找到,等待2秒,跳转到1 3.如果找到了,走向敌人 4.走向敌人的过程中,如果看见敌人了,则射击 5.如果敌人没有了,则跳转到1

  4. vue 数据绑定 绑定属性 循环渲染数据

    <template> <!-- vue的模板里面 所有的内容要被一个根节点包含起来 --> <div id="app"> <h2>{ ...

  5. JDK1.6 Java.lang.Null.Pointer.Exception

    先来看一下JDK1.6的API: NullPointerException (Java Platform SE 6) public class NullPointerException extends ...

  6. VMware安装CentOS7踩坑

      1.VMware安装Centos7加载界面不显示,但有快照 单击“开始”,运行中输入cmd. 然后输入命令 netsh winsock reset. 重启计算机. 2.nat模式网络问题     ...

  7. Python绘制2D图像

    封装了一个简单的2d绘图函数 from matplotlib import pyplot as plt def plot_line(*args, **kw): """ : ...

  8. python 之 XML的基本应用总结

    1.XML 的特征:xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标 ...

  9. sql中的in与not in,exists与not exists的区别

    1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表 ...

  10. C# .NET 配置404,500等错误信息

    <customErrors mode="On" defaultRedirect="viewAll.html"><!--所有的错误显示页--&g ...