Python 文件操作

Python 文件操作主要包括打开文件、读文件、写文件、修改文件、关闭文件等操作,还会写一些基本操作方法。

打开文件 - open()

在 python,使用 open 函数,可以打开一个已经存在的文件,或者创建一个新文件

open(文件名,访问模式)

示例如下:

1
f = open('test.txt', 'w')
访问模式 说明
r 只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件进行写入。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

关闭文件 - close()

1
2
3
4
5
# 新建一个文件,文件名为test.txt
f = open('test.txt', 'w')

# 关闭这个文件
f.close()

写文件 - write()

1
2
3
4
>>> f = open('text.txt', 'w')
>>> f.write('hello!')
6
>>> f.close()

如果文件不存在那么创建,如果存在那么就先清空,然后写入数据

读文件 - read()

使用 read(num) 可以从文件中读取数据,num 表示要从文件中读取的数据的长度(单位是字节),如果没有传入 num ,那么就表示读取文件中所有的数据。

1
2
3
4
5
>>> f = open('text.txt', 'r')
>>> content = f.read()
>>> content
'hello!'
>>> f.close()

读数据 - readlines()

readlines 可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

1
2
3
4
>>> f = open('text.txt', 'r')
>>> result = f.readlines()
>>> result
['hello!\n', 'world\n', 'haha\n']

读数据 - readline()

1
2
3
4
5
6
7
>>> f = open('text.txt', 'r')
>>> f.readline()
'hello!\n'
>>> f.readline()
'world\n'
>>> f.readline()
'haha\n'

处理大文件

一般的读取,readlines()、read() 等会将整个文件加载到内存中。在文件较大时,往往会引发 MemoryError(内存溢出)。本人试了用 readlines() 读取一个 2G 大小的日志文件,结果本子直接跑挂。

处理方法一般有以下几种:

逐行读取

1
2
3
4
5
while True:
line = f.readline()
if not line: # 到 EOF,返回空字符串,则终止循环
break
do_something(line)

使用 with 结构

with 语句句柄负责打开和关闭文件(包括在内部块中引发异常时),for line in f 对可迭代对象 f 进行迭代遍历,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文件的问题。

这也是较为推荐使用的方法。

1
2
3
with open(filename, 'rb') as f:
for line in f:
<do something with the line>

文件的随机读写

获取当前读写的位置 - tell()

在读写文件的过程中,如果想知道当前的位置,可以使用 tell() 来获取。

1
2
3
4
5
6
7
8
9
10
11
12
>>> f = open('/mnt/d/download/catalina.out','r')
>>> str = f.read(3)
>>> str
'Apr'
>>> str = f.read(30)
>>> str
' 25, 2017 10:54:11 AM org.apac'
>>> f.tell()
33
>>> str = f.read(200)
>>> f.tell()
233

定位到某个位置 - seek()

如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用 seek()。

seek(offset, from)

  • offset - 偏移量
  • from - 方向
    • 0 - 表示文件开头
    • 1 - 表示当前位置
    • 2 - 表示文件末尾
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> f = open('/mnt/d/download/catalina.out','r') 
>>> f.read(30)
'Apr 25, 2017 10:54:11 AM org.a'
>>> f.tell()
30
# 把位置设置为:从文件开头,偏移6个字节
>>> f.seek(6,0)
6
>>> f.tell()
6

# 把位置设置为:离文件末尾,20个字节处,需要已rb模式打开
>>> f = open('/mnt/d/download/catalina.out','rb')
>>> f.seek(-20,2)
2238539151
>>> f.read(10)
b'ged at DEB'
>>> f.read(10)
b'UG level.\n'

文件重命名 - os.rename('srcFile', 'destFile')

os 模块中的 rename() 可以完成对文件的重命名操作

删除文件 - os.remove('fileName')

文件夹的相关操作

  • 创建文件夹 - os.mkdir('dirName')
  • 获取当前目录 - os.getcwd()
  • 改变目录 - os.chdir('../')
  • 获取目录列表 - os.listdir('./')
  • 删除文件夹 - os.rmdir('dirName'),不能删除非空目录
1
2
3
4
5
6
7
8
9
10
11
12
>>> os.getcwd()
'/mnt/d/code/Python/itcast'
>>> os.mkdir('test')
>>> os.chdir('test')
>>> os.listdir('.')
[]
>>> os.chdir('../')
>>> os.listdir('./')
['07day_1.py', '07day_2.py', '07day_3.py', '1_1.py', 'func.py', 'test']
>>> os.rmdir('test')
>>> os.listdir('./')
['07day_1.py', '07day_2.py', '07day_3.py', '1_1.py', 'func.py']
hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
  • 本文作者: hoxis | 微信公众号【不正经程序员】
  • 本文链接: https://hoxis.github.io/python-handle-file.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!
0%