Python中文件的读和写(由一个小例子引起的思考)

统计单词在一段文本中出现的频率:

1
2
3
4
5
>>> import collections
>>> import os
>>> with open('/home/peter/Documents/por.txt') as file1:
str1 = file1.read().split(' ')
>>> print(collections.Counter(str1))

这里用空格分开每个单词。


文件的操作

分析一下:

首先读整个文件的写法,因为无论要对文件内容进行什么操作,都需要先打开这个文件:

1
with open('filename') as file1:

open()函数会在这个文件所在的目录中寻找对应文件名的文件,打开它。

open()函数还有另外的一个参数表示对文件的处理方式。例如”r”表示只读模式,”w”表示只写模式,等等。如果不指定对文件的操作方式,那么默认的操作方式是只读方式。

这里有一点要注意就是如果是写入”w”模式操作有的时候,如果要写入的文件名称不存在,系统就会自己创建这个文件,如果存在,在系统返回文件对象之前会清空文件。

python将内容写入文件的时候,只能是将字符串类型的值写入文件,所以在写入文件之前,非字符串类型的值需要先转换成字符串类型。

操作方式”a”表示不覆盖掉原来的内容,而是在原来内容结尾后继续写入新的内容。

open()函数返回的是一个文件对象,as给这个对象取一个别名。

1
2
3
4
5
6
7
8
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> test_me = open("test.txt")
>>> test_me
<_io.TextIOWrapper name='test.txt' mode='r' encoding='UTF-8'>
>>> type(test_me)
<class '_io.TextIOWrapper'>

1
2
3
4
5
6
7
8
9
>>> with open("test.txt") as testfile:
... contant = testfile.read()
...
>>> contant
'Chanel S.A. (/ʃəˈnɛl/; French: [ʃaˈnɛl]) is a French, privately held company
# 中间部分的内容省略掉了……
necklace of pearls, and a leather handbag.[3][6][8]'
>>> type(contant)
<class 'str'>

读取了内容之后,我们按照每行打印输出:

1
2
3
>>> with open("test.txt") as testfile:
... for line in testfile:
... print(line)

在这里我们得到的结果中每行之间多了一个空行,因为每一行后面都有一个看不到的换行符,我们使用 rstrip()函数来去除这个换行符。

函数rstrip()的作用就是删除字符串末尾的空白。

1
2
3
>>> with open("test.txt") as testfile:
... for line in testfile:
... print(line.rstrip())

函数read()是将文本的所有的内容都读出来返回一个字符串类型的值。

函数readlines()是将文本的所有内容按行读取,并且将每一行作为一个元素存储到一个列表中。

1
2
3
4
5
6
7
>>> with open(filename) as testfile:
... lines = testfile.readlines()
...
>>> lines
['Beijing\n', 'Paris\n', 'London\n', 'HongKong\n', 'Tianjin\n', 'Shanghai\n', 'Dalian\n', 'Shenyang']
>>> type(lines)
<class 'list'>

与rstrip()函数对应,strip()函数是用来去除每一行前面的空格的作用。


collections

collections是Python内建的一个集合模块,提供了许多有用的集合类。

关于这个模块另起一篇去描述。


附件

open中不同的参数对应不同的操作类型

文件打开的类型 表示的含义
“rt” 只读打开一个文本文件,只允许读数据
“wt” 只写打开或建立一个文本文件,只允许写数据
“at” 追加打开一个文本文件,并在文件末尾写数据
“rb” 只读打开一个二进制文件,只允许读数据
“wb” 只写打开或建立一个二进制文件,只允许写数据
“ab” 追加打开一个二进制文件,并在文件末尾写数据
“rt+” 读写打开一个文本文件,允许读和写
“wt+” 读写打开或建立一个文本文件,允许读写
“at+” 读写打开一个文本文件,允许读,或在文件末追加数据
“rb+” 读写打开一个二进制文件,允许读和写
“wb+” 读写打开或建立一个二进制文件,允许读和写
“ab+” 读写打开或建立一个二进制文件,允许读和写