Python 如何读取数据文件以及有哪些读写和操作方法

尽管有诸如 pandas.read_csv 之类的高级工具将磁盘上的数据文件读入 Python 数据结构,但我们还是需要了解一些有关 Python 文件处理方面的基础知识。好在它本来就很简单,这也是 Python 在文本和文件处理方面的如此流行的原因之一。

1. 文件操作

为了打开一个文件以便读写,可以使用内置的 open 函数以及一个相对或绝对的文件路径:

In [207]: path = 'examples/segismundo.txt'
In [208]: f = open(path)

默认情况下,文件是以只读模式(’r’)打开的。然后,我们就可以像处理列表那样来处理这个文件句柄 f 了,比如对行进行迭代:

for line in f:
    pass

从文件中取出的行都带有完整的行结束符(EOL),因此你常常会看到下面这样的代码(得到一组没有 EOL 的行):

In [209]: lines = [x.rstrip() for x in open(path)]
In [210]: lines
Out[210]: 
['Sueña el rico en su riqueza,',
 'que más cuidados le ofrece;',
 '','sueña el pobre que padece','su miseria y su pobreza;','',
 'sueña el que a medrar empieza,',
 'sueña el que afana y pretende,',
 'sueña el que agravia y ofende,',
 '','y en el mundo, en conclusión,','todos sueñan lo que son,','aunque ninguno lo entiende.','']

如果使用 open 创建文件对象,一定要用 close 关闭它。关闭文件可以返回操作系统资源:

In [211]: f.close()

用 with 语句可以可以更容易地清理打开的文件:

In [212]: with open(path) as f:
   ……:     lines = [x.rstrip() for x in f]

这样可以在退出代码块时,自动关闭文件。

2. 读写模式

如果输入 f =open(path,’w’),就会有一个新文件被创建在 examples/segismundo.txt,并覆盖掉该位置原来的任何数据。另外有一个 x 文件模式,它可以创建可写的文件,但是如果文件路径存在,就无法创建。表列出了所有的读 / 写模式。

模式 说明
r 只读模式
w 只写模式,创建新文件同时删除同名的任何文件
a 附加到现有的文件,如果文件不存在则创建新文件
r+ 读写模式
b 附加说明某模式用于二进制文件,即“rb”或“wb”
U 通用换行模式,单独使用“U”,或者附加到其他模式上,如“rU”

对于可读文件,一些常用的方法是 read、seek 和 tell。read 会从文件返回字符。字符的内容是由文件的编码决定的(如 UTF-8),如果是二进制模式打开的就是原始字节:

In [213]: f = open(path)
In [214]: f.read(10)
Out[214]: 'Sueña el r'
In [215]: f2 = open(path, 'rb')  # Binary mode
In [216]: f2.read(10)
Out[216]: b'Sue\xc3\xb1a el'

read 模式会将文件句柄的位置提前,提前的数量是读取的字节数。tell 可以给出当前的位置:

In [217]: f.tell()
Out[217]: 11
In [218]: f2.tell()
Out[218]: 10

尽管我们从文件读取了 10 个字符,位置却是 11,这是因为用默认的编码用了这么多字节才解码了这 10 个字符。你可以用 sys 模块检查默认的编码:

In [219]: import sys
In [220]: sys.getdefaultencoding()
Out[220]: 'utf-8'

seek 将文件位置更改为文件中的指定字节:

In [221]: f.seek(3)
Out[221]: 3
In [222]: f.read(1)
Out[222]: 'ñ'

最后,关闭文件:

In [223]: f.close()
In [224]: f2.close()

向文件写入,可以使用文件的 write 或 writelines 方法。例如,我们可以创建一个无空行版的 prof_mod.py:

In [225]: with open('tmp.txt', 'w') as handle:
   ……:     handle.writelines(x for x in open(path) if len(x) > 1)
In [226]: with open('tmp.txt') as f:
   ……:     lines = f.readlines()
In [227]: lines
Out[227]: 
['Sueña el rico en su riqueza,\n',
 'que más cuidados le ofrece;\n',
 'sueña el pobre que padece\n',
 'su miseria y su pobreza;\n',
 'sueña el que a medrar empieza,\n',
 'sueña el que afana y pretende,\n',
 'sueña el que agravia y ofende,\n',
 'y en el mundo, en conclusión,\n',
 'todos sueñan lo que son,\n',
 'aunque ninguno lo entiende.\n']

表列出了一些最常用的文件方法。

  • 发表于 · 2019.11.16 10:24 · 阅读 · 1934

[版权声明] :本文文字、代码及图片版权归原作者所有,任何媒体、网站或个人未经本网协议授权不得采集、整理、转载或以其他方式复制发表。已经本站协议授权的媒体、网站,在使用时必须注明“稿件来源:学研谷”。

0 条评论

请先 登录 后评论
猜猜我是谁
CSUA -研究生

2
提问
55
回答
27
文章