Python学习笔记 - 6.文件

打开文件

要打开的文件应该存储在你运行的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值