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

时间:2010-11-04 18:12:05

标签: python string excel grep

我运行了grep命令,在大型数据目录中找到了数百个字符串实例。这个文件是2 MB并且有我想要提取的字符串并放入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 个答案:

答案 0 :(得分:3)

所有这些都可以通过标准Python轻松完成,但对于“excel”(xls或xlsx)文件 - 您必须为此安装第三方库。但是,如果您只需要一个可以在传感器上打开的2D表格,您可以使用逗号分隔值(CSV)文件 - 这些文件可以与Excel和其他电子表格软件共同使用,并集成在Python中。

至于在文件中搜索字符串,它很简单。大多数事情你甚至可能都不需要正则表达式。你想要什么信息和字符串?

此外,标准库上的“os”模块具有列出目录或目录树中所有文件的一些功能。最简单的是os.listdir(路径)

“count”和“find”之类的字符串方法可以在“in”之外使用,以在文件中定位字符串,或计算出现次数。

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

除此之外,您可能会滥用python的buit-in列表对象作为操纵数据集的简单方法。

这是一个示例程序,用于计算在给定目录中的文件中找到的命令行中给出的字符串,并使用它们组装.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 :(得分: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的文件。

然后可以将此文件作为CSV文件导入Excel。如果您的输入不如您建议的那样可靠,那么正则表达式可能是更好的选择。