python入门04——文件(打开方式、文件对象方法)

文件

什么是文件?
在这里插入图片描述
文件的打开方式:
在这里插入图片描述
打开文件:

f = open('F:\\record.txt')  # 默认打开方式为只读
print(f)
## 结果为<_io.TextIOWrapper name='F:\\record.txt' mode='r' encoding='cp936'>

文件对象方法:
在这里插入图片描述
文件对象方法关于读文件的示例:

f = open('F:\\record.txt')
print(f)
print(f.read())  # 结果为zhai
print(f.tell())  # 返回当前文件指针位置,一共有4个英文字符,所以指向4。中文字符每个占2字节。
# print(f.read(3))  # 结果为zha
print(f.seek(2, 0))  # 在文件中移动指针,使得指针偏移2个字节
print(f.readline())  # 结果为ai

文件对象方法关于写文件的示例:

f = open('F:/test.txt', 'w')  # 将文件打开模式设置为可写w
print(f)
f.write('I love zhangyixing!')
f.close()  # 关闭之后立即将上述东西写入文件,不然只是放在其缓冲区内

【例】将record.txt文件中的对话内容按照======分割成3段对话,在每段对话中提取不同角色的说话内容并保存到相应的新文件中去。
在这里插入图片描述
将其划分为对应的文件,如下所示:
在这里插入图片描述
每个文件里保存相应角色在不同对话中的谈话内容。(如consultant1.txt保存了客服在第一段对话中的谈话内容)。consultant1.txt文件内容如下所示:
在这里插入图片描述
具体代码如下所示:

f = open('F:\\record.txt', encoding='UTF-8')
consumer = []  # 保存顾客语句
consultant = []  # 保存客服语句
count = 1

for each_line in f:
    if each_line[:6] != '======':  #分割字符串:无需判断那么长,只需要判断前6个是否为=
        # 按照======字符串进行分割
        (role, line_spoken) = each_line.split(':', 1)  # 按照:区分人物及语句
        if role == '顾客':
            consumer.append(line_spoken)  # 当冒号前面的字符为“顾客”时,将冒号后面的字符添加到consumer = []中
        if role == '客服':
            consultant.append(line_spoken)  # 当冒号前面的字符为“客服”时,将冒号后面的字符添加到consultant = []中
    else:
        # 文件的分别保存操作
        file_name_consumer = 'consumer' + str(count) + '.txt'
        file_name_consultant = 'consultant' + str(count) + '.txt'

        consumer_file = open(file_name_consumer, 'w')
        consultant_file = open(file_name_consultant, 'w')

        consumer_file.writelines(consumer)  # 多个语句按序列写用writelines
        consultant_file.writelines(consultant)

        consumer_file.close()  # 关闭文件才能保存之前写入的内容
        consultant_file.close()

        consumer = []  # 为了下一次循环初始化
        consultant = []
        count += 1

# 因为上述分割过程是按“======”分割的,而原本的文档中是用两行“======”分成三个对话,最后一段对话需要单独处理
file_name_consumer = 'consumer' + str(count) + '.txt'
file_name_consultant = 'consultant' + str(count) + '.txt'

consumer_file = open(file_name_consumer, 'w')
consultant_file = open(file_name_consultant, 'w')

consumer_file.writelines(consumer)
consultant_file.writelines(consultant)

consumer_file.close()
consultant_file.close()

f.close()  # 关闭record文件

注意:文件操作执行完记得close,避免忘记关闭文件导致资源的占用。
上述代码重复部分太多,代码可读性差,我们需要对它进行优化。很容易的就可以想到,我们可以定义几个函数来对一些重复操作进行封装,优化后的代码如下所示:

# 分别保存文档操作
def save_file(consumer, consultant, count):
    file_name_consumer = 'consumer' + str(count) + '.txt'
    file_name_consultant = 'consultant' + str(count) + '.txt'

    consumer_file = open(file_name_consumer, 'w')
    consultant_file = open(file_name_consultant, 'w')

    consumer_file.writelines(consumer)  # 多个语句按序列写用writelines
    consultant_file.writelines(consultant)

    consumer_file.close()  # 关闭文件才能保存之前写入的内容
    consultant_file.close()

# 分割文档操作
def split_file(file_name):
    f = open(file_name, encoding='UTF-8')
    consumer = []  # 保存顾客语句
    consultant = []  # 保存客服语句
    count = 1

    for each_line in f:
        if each_line[:6] != '======':
            # 按照======字符串进行分割
            (role, line_spoken) = each_line.split(':', 1)
            if role == '顾客':
                consumer.append(line_spoken)
            if role == '客服':
                consultant.append(line_spoken)
        else:
            # 文件的分别保存操作
            save_file(consumer, consultant, count)
            consumer = []  # 为了下一次循环初始化
            consultant = []
            count += 1

    save_file(consumer, consultant, count)      # 单独处理最后一段对话

    f.close()  # 关闭file_name文件

# 对record.txt进行分割
split_file('F:\\record.txt')

以上代码同样能够实现任务要求,在与该python文件的同目录下建立好了任务所需的文档。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值