Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将.txt文件解析为单个.csv输出_Python - Fatal编程技术网

Python 将.txt文件解析为单个.csv输出

Python 将.txt文件解析为单个.csv输出,python,Python,我目前正在尝试解析2个文本文件,然后有一个.csv输出。一个包含路径/文件位置列表,另一个包含与路径/文件位置相关的其他信息 第一个文本文件包含(path.txt): 第二个文本文件包含(filelist.txt): 如何获得包含文件路径及其相应哈希值的.csv输出?另外,如果我想添加与路径对应的其他列/信息 示例表输出: 文件路径 散列值 C:/Windows/System32/vssadmin.exe DA39A3EE5E6B4B0D3255BFF95601890AFD80709 C:

我目前正在尝试解析2个文本文件,然后有一个.csv输出。一个包含路径/文件位置列表,另一个包含与路径/文件位置相关的其他信息

第一个文本文件包含(path.txt):

第二个文本文件包含(filelist.txt):


如何获得包含文件路径及其相应哈希值的.csv输出?另外,如果我想添加与路径对应的其他列/信息

示例表输出:


文件路径
散列值
C:/Windows/System32/vssadmin.exe
DA39A3EE5E6B4B0D3255BFF95601890AFD80709
C:/Users/Administrator/Desktop/google.com
cf23df2207d99a74fbe169e3eba035e633b78987

要解析所谓的第二个
.txt
(它不是),您需要重新构造它,使它看起来像一个普通的python数据结构。它非常接近,有很多方法可以强迫它看起来像一个:

导入ast
contents=”“#这将用于保存该文件的读取内容
filestart=False
打开('filelist.txt')作为fh:
对于fh中的线路:
如果不是filestart而不是line.startswith(“$VAR”):
持续
elif line.startswith(“$VAR”):
contents+=“{”#启动字典
filestart=True#终止第一个if语句
其他:
内容+=行#填写文件的其余部分
#创建字典,我们在这里使用ast,因为json将失败
结果=ast.literal\u 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':'da39a3ee5e6b4b4bbd3255fef95601890afd80709',{'rootkitino':'Normal','FileVersionLabel':'6.1.7600.16385','ProductVersion':'6.1.7601.17514','Path':'C:/Users/Administrator/Desktop/steam.exe','Signer':'Valve Inc','Size':'300944','SHA1':'cf23df2207d99a74fbe169e3eba035e63b65d94',{'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':'cf23df2207d99a74fbe169e3eba035e63b78987'}]
files=result[“File”]#从这里获取您的列表
现在它的格式可以接受了,我将把它转换成
file:hash
键值对的dict,以便轻松查找其他文件

files\u dict={file['Path']:文件中的文件的文件['SHA1']
#现在抓取另一个文件,查找应该非常简单
以open(“path.txt”)作为fh:
结果=[f”{filepath.strip()},{files_dict.get(filepath.strip())}用于fh中的文件路径]
#现在你可以把它放到csv上了
以开放(“path.csv”、“w”)作为fh:
fh.write('File Path,Hash Value')#写入头
fh.write('\n'.join(结果))

有更好的方法可以做到这一点,但这可以留给读者作为练习来解析所谓的第二个
.txt
(它不是),您将需要重新构造它,使它看起来像一个普通的python数据结构。它非常接近,并且有一些方法可以强制它看起来像一个:

导入ast
contents=”“#这将用于保存该文件的读取内容
filestart=False
打开('filelist.txt')作为fh:
对于fh中的线路:
如果不是filestart而不是line.startswith(“$VAR”):
持续
elif line.startswith(“$VAR”):
contents+=“{”#启动字典
filestart=True#终止第一个if语句
其他:
内容+=行#填写文件的其余部分
#创建字典,我们在这里使用ast,因为json将失败
结果=ast.literal\u 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':'da39a3ee5e6b4b4bbd3255fef95601890afd80709',{'rootkitino':'Normal','FileVersionLabel':'6.1.7600.16385','ProductVersion':'6.1.7601.17514','Path':'C:/Users/Administrator/Desktop/steam.exe','Signer':'Valve Inc','Size':'300944','SHA1':'cf23df2207d99a74fbe169e3eba035e63b65d94',{'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':'cf23df2207d99a74fbe169e3eba035e63b78987'}]
files=result[“File”]#从这里获取您的列表
现在它的格式可以接受了,我将把它转换成
file:hash
键值对的dict,以便轻松查找其他文件

files\u dict={file['Path']:文件中的文件的文件['SHA1']
#现在抓取另一个文件,查找应该非常简单
以open(“path.txt”)作为fh:
结果=[f”{filepath.strip()},{files_dict.get(filepath.strip())}用于fh中的文件路径]
#现在你可以把它放到csv上了
以开放(“path.csv”、“w”)作为fh:
fh.write('File Path,Hash Value')#写入头
fh.write('\n'.join(结果))

有更好的方法可以做到这一点,但这可以留给读者作为练习

您可以构建与所需匹配的正则表达式模式

pattern = r"""{.*?(C:/Windows/System32/vssadmin.exe).*?'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.txt
中的路径;找到下一个
SHA1
行;e
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)
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]))