在文本文件中查找“string” – 使用Python将其添加到Excel文件

我运行了一个grep命令,在一个大的数据目录中发现了几百个string的实例。 这个文件是2 MB,并且有我想要提取出来的string,并将其放入Excel文件以便以后访问。 我正在提取的部分是我需要稍后处理的数据文件的path。

我最近一直在阅读关于Python的内容,并认为我可以自动地进行这种提取。 但是我有点难以启动。 我到目前为止:

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

但是,我不知道要用什么来摆脱我想要的文件。 任何初学者咀嚼?

编辑
这里有一些我正在寻找的信息。 我在文本文件中有几百行。 每行有一个path和一些像这样的string:

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

我想从这些行中得到具有特定“STRING = SOME_STRING”的行的path。 例如,如果行看起来像这样,我想path( /path/to/file )被提取到另一个文件:

/path/to/file:STRING=SOME_STRING

执行此操作的步骤如下所示:

  • 制作目录中所有文件的列表(如果您只对单个文件感兴趣,则不需要)
  • 提取您感兴趣的文件的名称
  • 在循环中,逐行读入这些文件
  • 看看这条线是否符合你的模式
  • 在第一个字符之前提取行的部分

所以,代码看起来像这样,只要你的文本文件按照你在问题中显示的格式进行格式化,并且这种格式是可靠的:

 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中。 如果您的input不如您所build议的可靠,那么正则expression式可能是更好的select。

所有这些用标准的Python很容易完成,但对于“excel”(xls或xlsx)文件,您必须为此安装第三方库。 但是,如果你只需要一张2D表格,就可以使用逗号分隔值(CSV)文件 – 这些文件可以与Excel和其他电子表格软件兼容,并且集成在Python中。

至于search一个文件内的string,这是很简单的。 大多数情况下甚至不需要正则expression式。 你想要什么信息与string?

而且,这个standardlib上的“os”模块有一些function可以列出目录中或目录树中的所有文件。 最直接的是os.listdir(path)

可以在“in”之外使用“count”和“find”之类的string方法来查找文件中的string,或者统计出现次数。

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

在远处,你可能会滥用python的buit-in列表对象作为操纵数据集的简单方法。

下面是一个示例程序,用于计算给定目录中的文件中的命令行中给出的string,并用它们组合一个.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()