【问题标题】:Find each keyword in a text file and record with file name在文本文件中查找每个关键字并用文件名记录
【发布时间】:2021-10-14 01:03:54
【问题描述】:

我已经从 SQL Server 下载了大约 100 个存储为 .txt 文件的过程。从这些 txt 文件中,我希望记录以“XXX”开头的关键字的每次迭代。因此,每次在脚本中出现单词时,都会将其放入数据框中,并在其旁边显示文件名。

例如:

文件:fileone

脚本:“AAA BBB CCC XXXA XXXB DDD”

会返回:

Keyword File
XXXA fileone
XXXB fileone

我有一个关键字数据框,并希望在我的所有文件中循环使用它。

理想情况下,输出如下所示:

Keyword File File File
XXXA fileone filetwo filethree
XXXB fileone filetwo null
XXXC null null filethree

下面是我用来返回关键字列表的代码:我通过获取所有存储过程的组合脚本(复制并粘贴到一个 txt 文件中)并找到所有关键字来执行此操作“XXX”。

with open(allprocs, 'r') as f:
for line in f:
    for word in line.split():
        if word.startswith('XXX.'):
            list.append(word)

new_List = pd.unique(list).tolist()
df1 = pd.DataFrame(new_List,
              columns = ['Tables'])
df1 = df1.drop_duplicates()

【问题讨论】:

    标签: python pandas list append inner-join


    【解决方案1】:

    由于我没有你的数据,我提供了一个解决方案,它为包含一些 python 脚本的目录生成数据集,我正在寻找以 n 开头的单词。

    首先,我们需要该目录中所有相关文件的列表,这样我们就可以一个一个地访问它们,避免手动复制和粘贴内容。

    import glob
    files = glob.glob("/PATH/*.py")
    

    接下来,我们将生成一个带有关键字文件映射的tidy 数据框。

    import pandas as pd
    import nltk  # optional
    collect = []
    for file in files:
        with open(file, 'r') as file_handle:
            for line in file_handle:
                # for word in line.split():
                for word in nltk.word_tokenize(line): # optional
                    if word.startswith('n'):
                        collect.append({'keyword': word, 'filename': file.split('/')[-1]})
    
    words_files_tidy = pd.DataFrame.from_records(collect).drop_duplicates()
    

    这为我们提供了您首先描述的数据框。

    keyword filename
    XXXA fileone
    XXXC fileone
    XXXB filetwo
    XXXC filetwo
    XXXA filethree

    最后,旋转数据集以获得所需的结果。

    final_df = words_files_tidy.pivot(index='keyword', columns='filename', values='filename').reset_index()
    

    你会得到什么

    Keyword fileone filetwo filethree
    XXXA fileone null filethree
    XXXB fileone filetwo null
    XXXC null null filethree

    必要时重命名列。

    【讨论】:

    • 这很棒,完全符合我的要求。如果我只想返回文件名而不是整个路径,我该怎么做?我认为这样做的一种方法是编写类似“file_handle = file_handle[61:-20]”这样的东西吗?
    • 解决了这个问题,方法是在 with open 行下添加“filename = file[61:-20]”并将 collect.append 行更改为具有“'filename': filename”,从而切断 C:用户......以及 .txt 扩展名。感谢@ufos 的帮助
    • @smitty_werben_jagerm 不要使用任何类似的技巧!大家可以看我的速成file.split('/')[-1],比较靠谱。一般参考这个帖子stackoverflow.com/questions/678236/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2019-08-26
    • 2016-08-25
    • 2013-04-27
    相关资源
    最近更新 更多