Python+文件处理

打开文件

我们使用 open() 函数打开文件。它需要两个参数,第一个参数是文件路径或文件名,第二个是文件的打开模式。

  • “r”,以只读模式打开,你只能读取文件但不能编辑/删除文件的任何内容
  • “w”,以写入模式打开,如果文件存在将会删除里面的所有内容,然后打开这个文件进行写入
  • “a”,以追加模式打开,写入到文件中的任何数据将自动添加到末尾

默认的模式为只读模式,也就是说如果你不提供任何模式,open() 函数将会以只读模式打开文件。

>>> fobj = open("sample.txt")	# 打开文件
>>> fobj
<_io.TextIOWrapper name='sample.txt' mode='r' encoding='UTF-8'>
>>> fobj.close()	# 关闭文件

打开文件后我们应该总是关闭文件。始终确保你显式关闭每个打开的文件,一旦它的工作完成你没有任何理由保持打开文件。

文件读取

read(size) 有一个可选的参数 size,用于指定字符串长度。如果没有指定 size 或者指定为负数,就会读取并返回整个文件。当文件大小为当前机器内存两倍时,就会产生问题。反之,会尽可能按比较大的 size 读取和返回数据。

# 使用 read() 方法一次性读取整个文件
>>> fobj = open("sample.txt")
>>> fobj.read()
'I love Python\nI love Code\n'
>>> fobj.read()	# 如果你再一次调用 read(),它会返回空字符串因为它已经读取完整个文件
''	
>>> fobj.close()

# readline() 能帮助你每次读取文件的一行
>>> fobj = open("sample.txt")
>>> fobj.readline()
'I love Python\n'
>>> fobj.readline()
'I love Code\n'
>>> fobj.close()

# 使用 readlines() 方法读取所有行到一个列表中
>>> fobj = open('sample.txt')
>>> fobj.readlines()
['I love Python\n', 'I love Code\n']
>>> fobj.close()

# 循环遍历文件对象来读取文件中的每一行
>>> fobj = open('sample.txt')
>>> for x in fobj:
...     print(x, end = '')
... 
I love Python
I love Code
>>> fobj.close()

程序打印文件内容

#!/usr/bin/env python3
name = input("Enter the file name: ")
fobj = open(name)
print(fobj.read())
fobj.close()

结果为

$ python3 test.py
Enter the file name: sample.txt
I love Python
I love Code

文件写入

让我们通过 write() 方法打开一个文件然后我们随便写入一些文本。

# 打开文件并写入内容
>>> fobj = open("ircnicks.txt", 'w')
>>> fobj.write('powerpork\n')
>>> fobj.write('indrag\n')
>>> fobj.write('mishti\n')
>>> fobj.write('sankarshan')
>>> fobj.close()

# 查看写入内容
>>> fobj = open('ircnicks.txt')
>>> s = fobj.read()
>>> fobj.close()
>>> print(s)
powerpork
indrag
mishti
sankarshan

示例程序

copy文件

拷贝给定的文本文件到另一个给定的文本文件。

#!/usr/bin/env python3
import sys
if len(sys.argv) < 3:
    print("Wrong parameter")
    print("./copyfile.py file1 file2")
    sys.exit(1)
f1 = open(sys.argv[1])
s = f1.read()
f1.close()
f2 = open(sys.argv[2], 'w')
f2.write(s)
f2.close()

sys.argv 包含所有命令行参数。这个程序的功能完全可以使用 shell 的 cp 命令替代:在 cp 后首先输入被拷贝的文件的文件名,然后输入新文件名。

sys.argv 的第一个值是命令自身的名字,下面这个程序打印命令行参数。

#!/usr/bin/env python3
import sys
print("First value", sys.argv[0])
print("All values")
for i, x  in enumerate(sys.argv):
    print(i, x)

结果为

$ ./argvtest.py Hi there
First value ./argvtest.py
All values
0 ./argvtest.py
1 Hi
2 there

这里我们用到了一个新函数 enumerate(iterableobject),在序列中循环时,索引位置和对应值可以使用它同时得到。

文本文件相关信息统计

对任意给定文本文件中的制表符、行、空格进行计数。

#!/usr/bin/env python3

import os
import sys


def parse_file(path):
    """
    分析给定文本文件,返回其空格、制表符、行的相关信息

    :arg path: 要分析的文本文件的路径

    :return: 包含空格数、制表符数、行数的元组
    """
    fd = open(path)
    i = 0
    spaces = 0
    tabs = 0
    for i,line in enumerate(fd):
        spaces += line.count(' ')
        tabs += line.count('\t')
    # 现在关闭打开的文件
    fd.close()

    # 以元组形式返回结果
    return spaces, tabs, i + 1

def main(path):
    """
    函数用于打印文件分析结果

    :arg path: 要分析的文本文件的路径
    :return: 若文件存在则为 True,否则 False
    """
    if os.path.exists(path):
        spaces, tabs, lines = parse_file(path)
        print("Spaces {}. tabs {}. lines {}".format(spaces, tabs, lines))
        return True
    else:
        return False


if __name__ == '__main__':
    if len(sys.argv) > 1:
        main(sys.argv[1])
    else:
        sys.exit(-1)
    sys.exit(0)

结果为

$ ./parsefile.py sample.txt
Spaces 4. tabs 0. lines 2

parse_file 函数真正的分析文件并返回结果,然后在 main() 函数里打印结果。通过分割代码到一些更小的单元(函数)里,能帮助我们组织代码库并且也更容易为函数编写测试用例。

使用with语句

在实际情况中,我们应该尝试使用 with 语句处理文件对象,它会在文件用完后会自动关闭,就算发生异常也没关系。它是 try-finally 块的简写:

>>> with open('sample.txt') as fobj:
...     for line in fobj:
...         print(line, end = '')
... 
I love Python
I love shiyanlou

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值