Найти "строку" в текстовом файле - добавить его в файл Excel с помощью Python - PullRequest
0 голосов
/ 04 ноября 2010

Я выполнил команду grep и обнаружил несколько сотен экземпляров строки в большом каталоге данных. Этот файл занимает 2 МБ и содержит строки, которые я хотел бы извлечь и поместить в файл Excel для быстрого доступа позже. Часть, которую я извлекаю - это путь к файлу данных, над которым мне нужно поработать позже.

Я недавно читал о Python и подумал, что смогу каким-то образом сделать это извлечение автоматически. Но я немного озадачен, как начать. У меня есть это до сих пор:

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

Но тогда я не уверен, что использовать, чтобы получить из файла то, что я хочу. Что-нибудь для начинающего пережевывать?

EDIT
Вот еще немного информации о том, что я искал. У меня есть несколько сотен строк в текстовом файле. У каждой строки есть путь и несколько строк вроде этого:

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

То, что я хотел бы из этих строк - это пути этих строк с определенным значением "STRING = SOME_STRING". Например, если строка выглядит следующим образом, я хочу, чтобы путь (/path/to/file) был извлечен в другой файл:

/path/to/file:STRING=SOME_STRING

Ответы [ 2 ]

3 голосов
/ 05 ноября 2010

Все это довольно легко сделать с помощью стандартного Python, но для файлов "excel" (xls или xlsx) - для этого вам потребуется установить стороннюю библиотеку.Однако если вам нужна только 2D-таблица, которая может открываться на электронной таблице, вы можете использовать файлы с разделителями-запятыми (CSV) - они совместимы с Excel и другим программным обеспечением для электронных таблиц и интегрированы в Python.

Какдля поиска строки внутри файла это просто.Вам может даже не понадобиться регулярные выражения для большинства вещей.Какую информацию вы хотите вместе со строкой?

Кроме того, модуль "os" в этой стандартной библиотеке имеет некоторые функции для вывода списка всех файлов в каталоге или в дереве каталогов.Наиболее простым является os.listdir (путь)

Строковые методы, такие как «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 голос
/ 05 ноября 2010

Для этого необходимо выполнить следующие шаги:

  • Составить список всех файлов в каталоге (это необязательно, если вас интересует только один файл)
  • Извлечение имен тех файлов, которые вас интересуют
  • В цикле прочитайте эти файлы построчно
  • Проверьте, соответствует ли строка вашему шаблону
  • Извлеките часть строки перед первым : символом

Итак, код будет выглядеть примерно так, при условии, что ваши текстовые файлы отформатированы так, как вы показали в вопросе, и чтоэтот формат надежно правильный:

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.Если ваш ввод менее надежен, чем вы предлагали, лучше использовать регулярные выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...