Python文件操作

文件操作

文件操作介绍

众所周知,文件是存储在硬盘或者其他外部存储设备之中的,我们想要操作文件对其内容进行修改的话就涉及到了应用程序对硬件的操作,但是应用程序是无法直接操作硬件设备的,需要操作系统对硬件设备进行操作,所以我们所说的文件操作,其本质上是应用程序利用操作系统所提供的的接口间接的对硬件设备进行操作的。
Python语言进行文件操作需要利用open()函数,open()函数获取文件流来对文件内容进行操作,这个流实际上就是一个I/O通道,即通常所说文件描述符。


文件打开方式

文件句柄方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 打开文件,得到文件句柄并赋值给一个变量
f = open('target_file.txt', mode='r', encoding='utf-8')

# 2. 通过句柄对文件进行操作
content = f.read()

# 3.输出读取到的结果
print(content)

# 4. 关闭文件
f.close()

>>> 文件中的内容:
>>> python
>>> java

上下文方式

1
2
3
4
5
6
7
8
# 1. with关键字引导上下文方式打开文件,并将句柄赋予别名f
with open('target_file.txt', mode='r', encoding='utf-8') as f:

# 2. 通过句柄对文件进行操作
content = f.read()

# 3.输出读取到的结果,用with上下文方式对文件进行操作会在结束操作时默认关闭文件,不必要主动close()
print(content)

操作文件

语法:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

操作符 作用
‘r’ 读取文件(默认)
‘w’ 覆盖写入文件
‘a’ 追加写入文件
‘b’ 二进制模式
‘t’ 文本模式(默认)
‘+’ 更新文件(读取与写入)
~~'U'~~ universal newline mode (在 Python 3.0 中成为默认行为)

  • mode='r':只读,文件不存在则报错
1
2
3
4
5
6
# target_file.txt文件中原始内容为:人生苦短,我用python

with open('target_file.txt', mode='r', encoding='utf-8') as f:
content = f.read()
print(content)
>>> 人生苦短,我用python
  • mode='rb':以bytes类型读

    1
    2
    3
    4
    5
    6
    # target_file.txt文件中原始内容为:人生苦短,我用python

    with open('target_file.txt', mode='rb') as f:
    content = f.read()
    print(content)
    >>> b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8python'
  • mode='r+':读写,文件不存在不会创建,写则会在指针后添加内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # target_file.txt文件中原始内容为:人生苦短,我用python

    with open('target_file.txt', mode='r+',encoding='utf-8') as f:
    content = f.read()
    f.write('\n新添加:Life is short , I use python')
    print(content)
    >>> 人生苦短,我用python
    # target_file.txt中的内容为:
    >>> 人生苦短,我用python
    >>> 新添加:Life is short , I use python
  • mode='r+b':以bytes类型读写

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # target_file.txt文件中原始内容为:人生苦短,我用python

    with open('target_file.txt', mode='r+b') as f:
    content = f.read()
    f.write('\n新添加:Life is short , I use python'.encode('utf-8'))
    print(content)
    >>> b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8python'
    # target_file.txt中的内容为:
    >>> 人生苦短,我用python
    >>> 新添加:Life is short , I use python

  • mode='w':只写,文件不存在则创建,文件存在则清空再写
1
2
3
4
5
# target_file.txt文件中原始内容为空,需要向其中写入:人生苦短,我用python
with open('target_file.txt', mode='w', encoding='utf-8') as f:
content = f.write('人生苦短,我用python')
# target_file.txt中的内容为:
>>> 人生苦短,我用python
  • mode='x':只写,文件不存在则创建,文件存在则报错
1
2
3
4
5
6
7
8
9
10
11
# target_file.txt文件中原始内容为空,需要向其中写入:人生苦短,我用python

with open('target_file.txt', mode='x', encoding='utf-8') as f:
content = f.write('人生苦短,我用python')
# target_file.txt存在:
>>> Traceback (most recent call last):
>>> File "D:/file_operate.py", line 94, in <module>
>>> with open('target_file.txt', mode='x', encoding='utf-8') as f:
>>> FileExistsError: [Errno 17] File exists: 'target_file.txt'
# target_file.txt不存在:
>>> 人生苦短,我用python
  • mode='wb':以bytes类型写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# target_file.txt文件中原始内容为空,需要向其中写入:人生苦短,我用python

with open('target_file.txt', mode='wb') as f:
content = f.write('人生苦短,我用python'.encode('utf-8'))
>>> 人生苦短,我用python

# # ④w+——写读,文件不存在则创建,写会覆盖之前的内容
with open('target_file.txt', mode='w+') as f:
content = f.write('hello,world')
date = f.read()
print(date)
>>>
# target_file.txt中的内容为:
>>> hello,world
  • mode='w+b':以bytes类型写读
1
2
3
4
5
6
7
8
9
# target_file.txt文件中原始内容为空,需要向其中写入:人生苦短,我用python

with open('target_file.txt', mode='w+b') as f:
content = f.write('hello,world'.encode('utf-8'))
date = f.read()
print(date)
>>> b''
# target_file.txt中的内容为:
>>> hello,world

追加

  • mode='a':追加,文件不存在则创建,文件存在则追加
1
2
3
4
5
6
# 此处target_file.txt文件中原始内容为:人生苦短,我用python,需要在后面添加'谁用谁知道'内容

with open('target_file.txt', mode='a', encoding='utf-8') as f:
content = f.write('谁用谁知道')
target_file.txt中的内容为:
>>> 人生苦短,我用python谁用谁知道
  • mode='ab':以bytes类型追加
1
2
3
4
5
# 此处target_file.txt文件中原始内容为:人生苦短,我用python,需要在后面添加'谁用谁知道'内容

with open('target_file.txt', mode='ab') as f:
content = f.write('谁用谁知道'.encode('utf-8'))
>>> 人生苦短,我用python谁用谁知道
  • mode='a+':可读可写,文件不存在则创建,写则追加

    1
    2
    3
    4
    5
    6
    7
    8
    # 此处target_file.txt文件中原始内容为:人生苦短,我用python,需要在后面添加'谁用谁知道'内容

    with open('target_file.txt', mode='a+',encoding='utf-8') as f:
    content = f.write('谁用谁知道')
    f.seek(0)
    date = f.read()
    print(date)
    >>> 人生苦短,我用python谁用谁知道
  • mode='a+b':以bytes类型可读可写

1
2
3
4
5
6
7
8
9
10
# 此处target_file.txt文件中原始内容为:人生苦短,我用python,需要在后面添加'谁用谁知道'内容

with open('target_file.txt', mode='a+b') as f:
content = f.write('谁用谁知道'.encode('utf-8'))
f.seek(0)
date = f.read()
print(date)
>>> b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8python\xe8\xb0\x81\xe7\x94\xa8\xe8\xb0\x81\xe7\x9f\xa5\xe9\x81\x93'
# target_file.txt中的内容为:
>>> 人生苦短,我用python谁用谁知道

文件修改

python没有提供直接修改文件的函数,只能新建文件,将源文件的内容修改完成后写入新文件中,再把原文件删除,新文件重命名

1
2
3
4
5
6
7
8
9
10
import os

with open('源文件', encoding='utf-8') as f, open('源文件.bak', mode='w', encoding='utf-8') as f_w:
for i in f:
if '源文件' in i:
i = i.replace('源文件', '更改后的源文件')
f_w.write(i)

os.remove('源文件')
os.rename('源文件.bak','源文件')

其他操作

  • seek() 移动光标指针位置
    seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

  • tell() 返回当前指针所在的位置
    tell对于英文字符就是占一个,中文字符占三个,参数表示的是字节数区分与read()的不同。

  • truncate() 截断文件
    truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。

  • readline() 读取一行

  • readlines() 读取多行,返回为列表

  • readable() 文件是否可读

  • writeline() 写入一行

  • writelines() 写入多行

  • writable() 文件是否可读

  • closed() 文件是否关闭

  • encoding=’utf-8’ 如果文件打开模式为b,则没有该属性

  • flush() 立刻将文件内容从内存刷到硬盘

  • for循环文件句柄

    1
    2
    3
    4
    5
    with open('target_file.txt', mode='r',encoding='utf-8') as f:
    for i in f:
    print(i)
    >>> 人生苦短,我用python
    >>> 谁用谁知道