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