2010-11-04 61 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

相關問題