2010-11-04 17 views
0

我运行了一个grep命令并在大型数据目录中发现了几百个字符串实例。这个文件是2 MB,并且有我想要提取出来的字符串,并将其放入Excel文件以便稍后访问。我正在提取的部分是我需要稍后处理的数据文件的路径。在文本文件中查找“字符串” - 使用Python将其添加到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

+0

对不起,但我想我无法正确理解你的问题:你想在你的文件中找到“字符串”,并为此,你的代码应该工作。然后你知道“string”在文件中。知道这一点后,你想要提取什么? – malvim 2010-11-04 18:14:42

+0

我想提取恰好在我找到的字符串之前出现的路径,并将其添加到Excel文件中。例如:/ path/to/string/file:“string_I_found”= ...我想要一个Excel文件中的“/ path/to/string/file”部分。我想解析的文件中可能有300个。 – nicorellius 2010-11-04 18:16:28

+0

如果您还不熟悉Python的版本,您可能需要研究Python的[正则表达式]版本(http://docs.python.org/library/re.html)。 – GreenMatt 2010-11-04 18:23:30

回答

1

的步骤来做到这一点,如下所示:CSV表与他们

  • 使目录中的所有文件的列表(如果你只在兴趣这是没有必要单个文件)
  • 一行提取那些你感兴趣的
  • 在循环中的文件,这些文件中读取行的名称
  • 看看行的模式匹配
  • 提取线的部分第一:字符前

因此,代码将是这个样子,只要你的文本文件的格式,你在问题中所展示的方式,这种格式是可靠的纠正:

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中。如果您的输入不如您所建议的可靠,则正则表达式可能是更好的选择。

+0

不错。我得到了这个脚本的工作。谢谢。我想要测试自己,我会尝试让递归工作。在这个问题中,我没有提到我想搜索一个包含许多子目录的目录... – nicorellius 2010-11-08 20:37:46

+0

如果要通过子目录递归,请查看'os.walk'和'glob.glob'的组合。 – 2010-11-09 12:48:07

3

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

至于搜索文件内的字符串,很简单。对于大多数事情你甚至可能不需要正则表达式。你想要什么信息以及字符串?

另外,这个standardlib上的“os”模块具有一些功能来列出目录中或目录树中的所有文件。最直截了当的是os.listdir(路径)

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

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

随着您离开,您可能会滥用python的buit-in列表对象,作为操纵数据集的简单方法。

这里是一个样例程序,用于计算在给定目录中的文件中找到的命令行中给出的字符串,并汇编一个。是

# -*- 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() 
+0

感谢您的回答。我会仔细观察,看看我能否理解它的作用。具体来说,我有一个像这样几百行的文件:/ path/to/file:“string”=“more string”。我想要的部分是直接在“:”之前的路径。看到我的原始问题了解更多详情... – nicorellius 2010-11-04 23:24:16

相关问题