打开文件
要打开的文件应该存储在你运行的python程序同一个文件夹下。
这个文件存储在你启动Python时所在的那个文件夹。
>>> fhand = open('mbox.txt')
>>> print fhand
<open file 'mbox.txt', mode 'r' at 0x1005088b0>
如果文件成功被打开, 操作系统会返回一个文件句柄。
如果文件不存在, 打开失败, 输出追踪错误信息。
文本文件与文本行
文本文件可视为若干文本行的序列,这与Python字符串是字符的序列道理相同。
邮件交流:文件中包含多条邮件, 遵守一种标准格式。 以“From ”开头的行是每一条邮件第一行, 以“From:” 开头的行是邮件的一部分, 注意区分。
将文本文件分解成文本行, “一行的结束”用专门的字符来表示, 称为换行符。常用换行符 \n 。
读取文本行
虽然文件句柄并不包含文件的数据, 但它可以方便地构建一个for循环, 按行依次读取文件。
fhand = open('mbox.txt')
count = 0
for line in fhand:
count = count + 1
print 'Line Count:', count
python open.py
Line Count: 132045
for循环中文件句柄被当做序列来使用。 for循环只是简单地计算并输出文件的行数。可翻译成:“每遇到文件中的一行( 表示为文件句柄) , 将count变量值加一”。
以for循环这种方式读取文件时, Python根据换行符将文件数据分成若干文本行。 每次迭代中将换行符作为一行的最后一个字符。
如果文件大小相对于内存容量来说很小, 那么就可以把它当做一个字符串, 在文件句柄上使用read方法一次性读取进来。
>>> fhand = open('mbox-short.txt')
>>> inp = fhand.read()
>>> print len(inp)
94626
>>> print inp[:20]
From stephen.marquar
以这种方式读取文件时, 所有的文本行和换行符被当做一个整体, 作为一个大字符串存储在inp变量中。 只有当计算机内存能够承载文件数据大小的情况下, 才能用这种方式打开文件。
搜索文件
将文件读取与字符串方法结合。
例, 读取一个文件并把以“From:”开头的行打印出来。 我们可以使用字符串startswith方法来选择符合前缀要求的行。
fhand = open('mbox-short.txt')
for line in fhand:
if line.startswith('From:') :
print line
From: stephen.marquard@uct.ac.za
From: louis@media.berkeley.edu
From: zqian@umich.edu
From: rjlowe@iupui.edu
每一行都以换行符结束, 因此print语句输出的变量line中的字符串带有一个换行符, print输出时本身还会增加一个换行符。所以会出现空行。…
我们可以使用字符串分割来打印出不含最后一个字符的文本行, 不过还有一个更简单的办法, 使用rstrip方法截掉字符串后面的空白符, 程序代码如下所示:
fhand = open('mbox-short.txt')
for line in fhand:
line = line.rstrip()
if line.startswith('From:') :
print line
程序运行结果如下:
From: rjlowe@iupui.edu
From: zqian@umich.edu
From: rjlowe@iupui.edu
From: cwen@iupui.edu
...
continue语句来编写搜索循环的思路: 搜索循环的基本思路是寻找“感兴趣的”行,跳过“不感兴趣的”行。 当找到感兴趣的的文本行, 执行相应的操作。
fhand = open('mbox-short.txt')
for line in fhand:
line = line.rstrip()
# Skip 'uninteresting lines'
if not line.startswith('From:') :
continue
# Process our 'interesting' line
print line
用find方法模拟文本编辑器查找功能:
find方法可以寻找一个字符串在另一个字符串中出现的次数, 也可以返回字符串的位置或-1( 表示字符串没有找到) 。编写一个循环, 找到包含“@uct.ac.za”字符串的文本行。
fhand = open('mbox-short.txt')
for line in fhand:
line = line.rstrip()
if line.find('@uct.ac.za') == -1 :
continue
print line
让用户选择文件名
fname = raw_input('Enter the file name: ')
fhand = open(fname)
使用try.except与open
fname = raw_input('Enter the file name: ')
try:
fhand = open(fname)
except:
print 'File cannot be opened:', fname
exit()
count = 0
for line in fhand:
if line.startswith('Subject:') :
count = count + 1
print 'There were', count, 'subject lines in', fname
exit()函数会终止程序, 这个程序永不返回值。 质量保障(QA)。
写入文件
为了能够写入文件, 需要在打开文件时使用“w”作为第二个参数。
>>> fout = open('output.txt', 'w')
>>> print fout
<open file 'output.txt', mode 'w' at 0xb7eb2410>
如果文件已经存在, 以写入模式打开文件, 这样会删除旧数据, 因此请谨慎使用。 如果文件不存在, 那么会创建一个新的文件。
文件句柄对象的write方法把数据写入文件。
>>> line1 = 'This here's the wattle,\n'
>>> fout.write(line1)
在结束一行时, 确保已明确插入了换行符。 print语句会自动加上一个换行符, 而write方法不会这样做。
>>> line2 = 'the emblem of our land.\n'
>>> fout.write(line2)
当文件写入完成, 记得关闭文件, 确保写入物理磁盘, 这样断电后数据才不会丢失。
>>> fout.close()
以读方式打开文件也要记得关闭文件。 只顾打开新文件就显得有点粗心大意了。 Python会在程序结束时, 确认所有打开的文件被关闭了。 当写入文件时, 我们要对文件关闭进行明确声明, 确保万无一失。
调试
内置函数repr可以解决空格符、 制表符和换行符等空格带来的问题。 它将任一对象作为参数, 返回该对象的一个字符串表示。 这对调试很有帮助。
>>> s = '1 2\t 3\n 4'
>>> print s
1 2 3
4
>>> print repr(s)
'1 2\t 3\n 4'
另一个可能遇到的问题是, 不同的操作系统使用不同的字符来表示一行的结束。 一些操作系统使用换行符\n, 一些操作系统使用返回字符\r, 还有一些操作系统两者都使用。 如果在不同的操作系统之间转移文件, 这些差异可能会导致错误发生。绝大多数操作系统都提供格式转换的应用。 详细信息和更多疑问请访问 http://wikipedia.org/wiki/Newline。