В настоящее время я пытаюсь проанализировать 2 текстовых файла, а затем вывод .csv. Один содержит список пути / местоположения файла, а другой - другую информацию, связанную с расположением пути / файла.

1-й текстовый файл содержит (path.txt):

C:/Windows/System32/vssadmin.exe
C:/Users/Administrator/Desktop/google.com

2-й текстовый файл содержит (filelist.txt):

-= List of files in hash: =-

$VAR1 = {
          'File' => [
                      {
                        'RootkitInfo' => 'Normal',
                        'FileVersionLabel' => '6.1.7600.16385',
                        'ProductVersion' => '6.1.7601.17514',
                        'Path' => 'C:/Windows/System32/vssadmin.exe',
                        'Signer' => 'Microsoft Windows',
                        'Size' => '210944',
                        'SHA1' => 'da39a3ee5e6b4b0d3255bfef95601890afd80709'
                        },
                        {
                        'RootkitInfo' => 'Normal',
                        'FileVersionLabel' => '6.1.7600.16385',
                        'ProductVersion' => '6.1.7601.17514',
                        'Path' => 'C:/Users/Administrator/Desktop/steam.exe',
                        'Signer' => 'Valve Inc.',
                        'Size' => '300944',
                        'SHA1' => 'cf23df2207d99a74fbe169e3eba035e633b65d94'
                        },
                        {
                        'RootkitInfo' => 'Normal',
                        'FileVersionLabel' => '6.1.7600.16385',
                        'ProductVersion' => '6.1.7601.17514',
                        'Path' => 'C:/Users/Administrator/Desktop/google.com',
                        'Signer' => 'Valve Inc.',
                        'Size' => '300944',
                        'SHA1' => 'cf23df2207d99a74fbe169e3eba035e633b78987'
                        },
                        .
                        .
                        .
                    ]
          }

Как мне получить вывод .csv, содержащий путь к файлу с соответствующим хеш-значением? Кроме того, в случае, если я хотел бы добавить дополнительную колонку / информацию, соответствующую пути?

Пример таблицы вывода:

    <table>
      <tr>
        <th>File Path</th>
        <th>Hash Value</th> 
      </tr>
      <tr>
        <td>C:/Windows/System32/vssadmin.exe</td>
        <td>da39a3ee5e6b4b0d3255bfef95601890afd80709</td> 
      </tr>
      <tr>
        <td>C:/Users/Administrator/Desktop/google.com</td>
        <td>cf23df2207d99a74fbe169e3eba035e633b78987</td> 
      </tr>
    </table>
0
iX6t 23 Май 2019 в 03:31

2 ответа

Лучший ответ

Вы можете создать шаблон регулярного выражения, который соответствует тому, что вы ищете

pattern = r"""{.*?(C:/Windows/System32/vssadmin.exe).*?'SHA1' => '([^']*)'.*?}"""

Чтобы использовать его с несколькими именами файлов в цикле, превратите этот шаблон в строку формата .

fmt = r"""{{.*?({}).*?'SHA1' => '([^']*)'.*?}}"""

Что-то вроде этого:

import re
with open('filelist.txt') as f:
    s = f.read()
with open('path.txt') as f:
    for line in f:
        pattern = fmt.format(line.strip())
        m = re.search(pattern, s, flags=re.DOTALL)
        if m:
            print(m.groups())
        else:
            print('no match for', fname)

Это немного неэффективно и зависит от того, какое содержимое файлов будет точно таким же, как вы представляли - например, заглавные буквы одинаковы.


Или без регулярных выражений: переберите строки filelist.txt; найдите строку Path; извлеките путь с помощью фрагмента, посмотрите, является ли он путем из path.txt; найдите следующую следующую SHA1 строку; извлечь хеш с ломтиком. Это зависит от положения двух строк относительно друг друга и положения символов в каждой строке. Это, вероятно, будет более эффективным.

with open('path.txt') as f:
    fnames = set(line.strip() for line in f)
with open('filelist.text') as f:
    for line in f:
        line = line.strip()
        if line.startswith("'Path'") and line[11:-2] in fnames:
            name = line[11:-2]
            while not line.startswith("'SHA1'"):
                line = next(f)
                line = line.strip()
            print((name, line[11:-2]))

Этот также предполагает, что текстовые файлы такие, как вы их представляли.

1
wwii 23 Май 2019 в 02:19

Чтобы проанализировать предполагаемую секунду .txt (которой это не так), вам нужно будет перестроить ее так, чтобы она выглядела как обычная структура данных python. Это довольно близко, и есть способы заставить его выглядеть так:

import ast

contents = "" # this will be to hold the read contents of that file
filestart = False 

with open('filelist.txt') as fh:
    for line in fh:
        if not filestart and not line.startswith("$VAR"):
            continue
        elif line.startswith("$VAR"):
            contents+="{" # start the dictionary
            filestart = True # to kill the first if statement
        else:
            contents += line # fill out with rest of file


# create dictionary, we use ast here because json will fail
result = ast.literal_eval(contents.replace("=>", ":"))

# {'File': [{'RootkitInfo': 'Normal', 'FileVersionLabel': '6.1.7600.16385', 'ProductVersion': '6.1.7601.17514', 'Path': 'C:/Windows/System32/vssadmin.exe', 'Signer': 'Microsoft Windows', 'Size': '210944', 'SHA1': 'da39a3ee5e6b4b0d3255bfef95601890afd80709'}, {'RootkitInfo': 'Normal', 'FileVersionLabel': '6.1.7600.16385', 'ProductVersion': '6.1.7601.17514', 'Path': 'C:/Users/Administrator/Desktop/steam.exe', 'Signer': 'Valve Inc.', 'Size': '300944', 'SHA1': 'cf23df2207d99a74fbe169e3eba035e633b65d94'}, {'RootkitInfo': 'Normal', 'FileVersionLabel': '6.1.7600.16385', 'ProductVersion': '6.1.7601.17514', 'Path': 'C:/Users/Administrator/Desktop/google.com', 'Signer': 'Valve Inc.', 'Size': '300944', 'SHA1': 'cf23df2207d99a74fbe169e3eba035e633b78987'}]}

files = result["File"] # get your list from here

Теперь, когда он в приемлемом формате, я бы преобразовал его в набор из file: hash пар ключ-значение для облегчения поиска в вашем другом файле.

files_dict = {file['Path']: file['SHA1'] for file in files}

# now grab your other file, and lookups should be quite simple

with open("path.txt") as fh:
    results = [f"{filepath.strip()}, {files_dict.get(filepath.strip())}" for filepath in fh]

# Now you can put that to a csv
with open("paths.csv", "w") as fh:
    fh.write('File Path,  Hash Value') # write the header
    fh.write('\n'.join(results))

Есть лучшие способы сделать это, но это может быть оставлено читателю в качестве упражнения

1
C.Nivs 23 Май 2019 в 01:40