• 语料库数据处理个案实例(读取多个文本文件、读取一个文件夹下面指定的多个文件、解码错误、读取多个子文件夹文本、多个文件批量改名)


    7.10 读取多个文本文件

    • 在前面的章节中,我们示范了如何读取单个文本文件,并对之进行相关文本处理。在语料库语言学研究中,语料库往往存储在多个文本中。本小节中,我们首先介绍如何读取文件夹中多个文本的文件名;然后介绍如何读取多个文件,并将它们合并成一个文本;最后介绍如何读取多个子文件夹中的文本。

    7.10.1 读取文件夹中多个文件的文件名

    • 本小节中我们提供示例:如何读取某文件夹中多个文件的文件名。我们需要完成的任务是打印D:\works\文本分析\leopythonbookdata-master\texts文件夹所有txt文本文件。请看下面的代码。
    import os
    target_dir = r'D:\works\文本分析\leopythonbookdata-master\texts'
    files = os.listdir(target_dir)
    
    for file in files:
        if file.endswith(r'.txt'):
            print(file)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    • 首先通过import os 语句引入 os 库,然后,定义需要读取的目标文件夹路径和文件名。接下来,通过os.listdir()函数来读入文件夹中的所有文件名。
    • os.listdir()函数需要一个参数,是需要读取的文件夹的路径和文件夹名。它将读取的文件夹中的所有文件名保存为一个列表,列表的每一个元素为一个文件名。下面的for … in 循环遍历读取的文件名,如果文件名以“.txt”结尾,则打印该文件名。

    7.10.2 合并多个文本(解码错误的解决办法)

    • 本小节我们读取D:\works\文本分析\leopythonbookdata-master\texts文件夹中所有的txt文本文件,并将这些文本文件的内容合并到一个新建的文本文件"filles_combined.txt"中,请看下面的代码。
    import os
    target_dir = 'D:/works/文本分析/leopythonbookdata-master/texts/'
    files = os.listdir(target_dir)
    file_out = open(target_dir + 'files_combined.txt','a',encoding='utf8')
    for file in files:
        if file.endswith(r'.txt'):
            file_in = open(target_dir + file,'r',encoding='ISO-8859-1')#这里没有encoding,亦或用'utf8'编码都会出现报错
            text = file_in.readlines()
            for t in text:
                file_out.write(t)
            file_in.close()
    file_out.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    7.10.3 读取多个子文件夹文本

    • 前面两个小节我们介绍了如何利用os.listdir()函数读取一个文件夹中的多个文本。但是,如果文件夹中含有子文件夹,os.listdir()函数并不能读取子文件夹中的文本。在语料库研究中,文本往往可能存储在一个文件夹下的多个子文件夹中,如果要读取子文件夹中的文本,就需要使用os模块的os.walk()函数。
    • 我们来看下面的例子。假设语料库为D:/works/文本分析/leopythonbookdata-master/texts/文件夹中的所有以.txt结尾的文本文件。该文件夹中又有D:/works/文本分析/leopythonbookdata-master/texts/temp_folder/子文件夹,该子文件夹中也有数个文本文件。下面的代码展示如何读取D:/works/文本分析/leopythonbookdata-master/texts/文件夹(包括子文件)中的所有文本文件。
    import os
    rootdir = 'D:/works/文本分析/leopythonbookdata-master/texts/'
    allfiles = []
    for root,subFolder,files in os.walk(rootdir):
        for file in files:
            allfiles.append(os.path.join(root,file))
    for i in allfiles:
        if i.endswith('.txt'):
            print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 上面代码的第一二行,我们首先通过import os 引入os模块,然后定义语料库所有的文件夹(rootdir = ‘D:/works/文本分析/leopythonbookdata-master/texts/’)。第三行,我们定义一个空列表allfiles,用以储存所有带有绝对路径的文件名。第四行,我们循环遍历rootdir文件夹中的根目录(root)、子目录(subFolders)和根目录下所有带有绝对路径的文件名(files)。其中,最重要的是files,它是一个列表,包含所有根目录下(含子文件夹)带有绝对路径的文件名。读者可以在该循环中加如下三行代码,打印出root,subFolders,files的内容,以更深入了解它们的内容。代码如下:
    for root,subFolder,files in os.walk(rootdir):
        # print('root:',root)
        # print('subFolders:',subFolder)
        # print('files:',files,'\n')
    
    • 1
    • 2
    • 3
    • 4
    • 我们可以将上面的代码进行修改,读取每个文件,并将它们合并到一个文本中。请看下面的代码。
    import os
    rootdir = 'D:/works/文本分析/leopythonbookdata-master/texts/'
    allfiles = []
    file_out = open(rootdir + 'allfiles_combined.txt','a',encoding='utf8')
    for root,subFolder,files in os.walk(rootdir):
        for file in files:
            allfiles.append(os.path.join(root,file))
    for i in allfiles:
        if i.endswith('.txt'):
            file_in = open(i,'r',encoding='ISO-8859-1')
            for line in file_in.readlines():
                file_out.write(line)
            file_in.close()
    file_out.close()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    7.11 多个文件批量改名

    • 本小节我们读取’D:/works/文本分析/leopythonbookdata-master/texts/temp_folder/‘文件夹中的所有文本文件,并将每个文本的文件名改名为’源文件主题部分_changed.txt’。请看下面的代码。
    import os
    target_dir = 'D:/works/文本分析/leopythonbookdata-master/texts/temp_folder/'
    files = os.listdir(target_dir)
    
    for file in files:
        if file.endswith(".txt"):
            # open the txt file
            file_in = open(target_dir + file,'r',encoding='ISO-8859-1')
            text = file_in.readlines()
    
            # open the new txt file with file name changed
            file_out = open(target_dir + file[:-4] + "_changed.txt",'a')
            for t in text:
                file_out.write(t)
            file_in.close()
            file_out.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    使用python获取城市经纬度以及城市间的距离、火车时间、所需成本等
    ssm+vue的药品管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。
    Android 虚拟机
    pgsql中实现按周统计,计算日期是周几
    面试官:请分析一条SQL的执行
    uboot启动流程-涉及_main汇编函数
    gRPC 应用指引
    【UE5 Cesium】15-Cesium for Unreal 加载本地影像和地形
    mysql部分特性
    10.3 校招 实习 内推 面经
  • 原文地址:https://blog.csdn.net/Triumph19/article/details/125426439