在文本文件中查找“字符串” - 使用Python添加到Excel文件

0 投票
2 回答
6380 浏览
提问于 2025-04-16 06:34

我运行了一个 grep 命令,发现一个大文件夹里有几百个相同的字符串。这个文件有2MB大,我想把里面的一些字符串提取出来,放到Excel文件里,以便以后方便查看。我想提取的部分是我需要后续处理的数据文件的路径。

最近我在学习Python,想着能不能自动完成这个提取的工作。但是我有点不知道从哪里开始。到目前为止,我写了这些代码:

data = open("C:\python27\text.txt").read()
if "string" in data:

不过接下来我不太确定该用什么方法从文件中提取我想要的内容。有没有适合初学者的建议呢?

编辑
这里有一些我想要的信息。我在一个文本文件里有几百行。每一行都有一个路径和一些字符串,像这样:

/path/to/file:STRING=SOME_STRING, ANOTHER_STRING

我想从这些行中提取出带有特定 "STRING=SOME_STRING" 的路径。例如,如果某一行是这样的,我想把路径 (/path/to/file) 提取到另一个文件里:

/path/to/file:STRING=SOME_STRING

2 个回答

3

用标准的Python处理这些事情非常简单,但如果你想处理“excel”文件(比如xls或xlsx格式),就需要安装一个第三方库。不过,如果你只需要一个可以在电子表格中打开的二维表格,可以使用逗号分隔值(CSV)文件。这种文件格式与Excel和其他电子表格软件兼容,而且Python自带支持。

至于在文件中查找字符串,这也很简单。大多数情况下,你甚至不需要使用正则表达式。你想要查找字符串时,还需要什么其他信息吗?

另外,Python的“os”模块里有一些函数可以列出目录中的所有文件,或者整个目录树中的文件。最简单的用法是 os.listdir(path)。

字符串的方法,比如“count”和“find”,可以用来查找文件中的字符串,或者计算字符串出现的次数,除了使用“in”之外。

最后,“CSV”模块可以写出格式正确的文件,以便在任何电子表格中读取。

在这个过程中,你可以灵活使用Python内置的列表对象,方便地处理数据集。

下面是一个示例程序,它可以统计在命令行中给出的字符串,在指定目录的文件中查找,并将结果整理成一个CSV表格:

# -*- coding: utf-8 -*-
import csv
import sys, os

output_name = "count.csv"

def find_in_file(path, string_list):
    count = []
    file_ = open(path)
    data = file_.read()
    file_.close()
    for string in string_list:
        count.append(data.count(string))
    return count


def main():
    if len(sys.argv) < 3:
        print "Use %s directory_path <string1>[ string2 [...]])\n"  % __package__
        sys.exit(1)
    target_dir = sys.argv[1]
    string_list = sys.argv[2:]
    csv_file = open(output_name, "wt")
    writer = csv.writer(csv_file)
    header = ["Filename"] + string_list
    writer.writerow(header)
    for filename in os.listdir(target_dir):
        path = os.path.join(target_dir, filename)
        if not os.path.isfile(path):
            continue
        line = [filename] + find_in_file(path, string_list)
        writer.writerow(line)
    csv_file.close()

if __name__=="__main__":
    main()
1

要完成这个任务,步骤如下:

  • 先列出目录下的所有文件(如果你只关心一个文件,这一步可以省略)
  • 找出你感兴趣的文件名
  • 用循环逐行读取这些文件
  • 检查每一行是否符合你的要求
  • 提取每一行中第一个:字符之前的部分

所以,代码大概是这样的,前提是你的文本文件格式和你在问题中展示的一样,并且这个格式是可靠的:

import sys, os, glob

dir_path = sys.argv[1]
if dir_path[-1] != os.sep: dir_path+=os.sep

file_list = glob.glob(dir_path+'*.txt') #use standard *NIX wildcards to get your file names, in this case, all the files with a .txt extension

with open('out_file.csv', 'w') as out_file:
    for filename in file_list:
        with open(filename, 'r') as in_file:
            for line in in_file:
                if 'STRING=SOME_STRING' in line:
                    out_file.write(line.split(':')[0]+'\n') 

这个程序可以通过命令python extract_paths.py path/to/directory来运行,运行后会在你当前的目录下生成一个叫out_file.csv的文件。

这个文件可以导入到Excel中作为CSV文件。如果你的输入数据不太可靠,使用正则表达式可能会更合适。

撰写回答