文件和操作系统

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

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

  1. In [518]: path = 'ch13/segismundo.txt'
  2.  
  3. In [519]: f = open(path)

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

  1. for line in f:
  2. pass

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

  1. In [520]: lines = [x.rstrip() for x in open(path)]
  2.  
  3. In [521]: lines
  4. Out[521]:
  5. ['Sue\xc3\xb1a el rico en su riqueza,',
  6. 'que m\xc3\xa1s cuidados le ofrece;',
  7. '',
  8. 'sue\xc3\xb1a el pobre que padece',
  9. 'su miseria y su pobreza;',
  10. '',
  11. 'sue\xc3\xb1a el que a medrar empieza,',
  12. 'sue\xc3\xb1a el que afana y pretende,',
  13. 'sue\xc3\xb1a el que agravia y ofende,',
  14. '',
  15. 'y en el mundo, en conclusi\xc3\xb3n,',
  16. 'todos sue\xc3\xb1an lo que son,',
  17. 'aunque ninguno lo entiende.',
  18. '']

如果输入f =open(path,'w'),就会有一个新文件被创建在ch13/segismundo.txt,并覆盖掉该位置原来的任何数据。表A-5列出了所有可用的文件读写模式。

文件和操作系统 - 图1

译注12:这的“名”包括路径。

要将文本写入文件,可以使用该文件的write或writelines方法。例如,我们可以创建一个无空行版的prof_mod.py译注13,如下所示:

  1. In [522]: with open('tmp.txt', 'w') as handle:
  2. .....: handle.writelines(x for x in open(path) if len(x) > 1)
  3.  
  4. In [523]: open('tmp.txt').readlines()
  5. Out[523]:
  6. ['Sue\xc3\xb1a el rico en su riqueza,\n',
  7. 'que m\xc3\xa1s cuidados le ofrece;\n',
  8. 'sue\xc3\xb1a el pobre que padece\n',
  9. 'su miseria y su pobreza;\n',
  10. 'sue\xc3\xb1a el que a medrar empieza,\n',
  11. 'sue\xc3\xb1a el que afana y pretende,\n',
  12. 'sue\xc3\xb1a el que agravia y ofende,\n',
  13. 'y en el mundo, en conclusi\xc3\xb3n,\n',
  14. 'todos sue\xc3\xb1an lo que son,\n',
  15. 'aunque ninguno lo entiende.\n']

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

文件和操作系统 - 图2

译注1:这里只是作者起的名字而已,不必介怀,你完全可以给它起个“真命天子类型”之类的名字。其实它是一个哲学和逻辑学概念,就是说“对于一只鸟类动物,不用管它到底是不是鸭子,只要看它像不像鸭子就可以了”。

译注2:也就是定义别名。

译注3:在函数式编程中,也常译作惰性求值。

译注4:这个词指的是“不能修改原内存块的数据”。也就是说,即使修改操作成功了,也只是创建了一个新对象并将其引用赋值给原变量而已。

译注5:作者用的比我现在用的版本还老。所以在阅读本书的过程中有些例子的计算结果不一定跟书上的完全一致。

译注6:分子也可以的。

译注7:或者翻译成可散列性。

译注8:应该是">=",因为原文是"two and more"。

译注9:注意缩进,别搞成递归了。

译注10:注意这里的逗号。

译注11:应该放到for循环之前,否则后面的执行结果与书上的不一样。

译注13:应该是segismundo.txt。