我有一个工作代码,它接受csv文件的目录并散列每行的一列,然后将所有文件聚合在一起。问题是输出只显示第一个哈希值,而不是为每一行重新运行哈希值。这是代码:
import glob
import hashlib
files = glob.glob( '*.csv' )
output="combined.csv"
with open(output, 'w' ) as result:
for thefile in files:
f = open(thefile)
m = f.readlines()
for line in m[1:]:
fields = line.split()
hash_object = hashlib.md5(b'(fields[2])')
newline = fields[0],fields[1],hash_object.hexdigest(),fields[3]
joined_line = ','.join(newline)
result.write(joined_line+ '\n')
f.close()
答案 0 :(得分:3)
您正在创建 fixed bytestring b'(fields[2])'
的哈希值。该值与您的CSV数据无关,即使它使用与行变量名称中使用的字符相同的字符。
您需要从实际行传递字节:
hash_object = hashlib.md5(fields[2].encode('utf8'))
我假设您的fields[2]
列是一个字符串,因此您需要先对其进行编码以获取字节数。 UTF-8编码可以处理可能包含在字符串中的所有代码点。
您似乎也在重新发明CSV读写轮;您可能应该使用csv
module代替:
import csv
# ...
with open(output, 'w', newline='') as result:
writer = csv.writer(result)
for thefile in files:
with open(thefile, newline='') as f:
reader = csv.reader(f)
next(reader, None) # skip first row
for fields in reader:
hash_object = hashlib.md5(fields[2].encode('utf8'))
newrow = fields[:2] + [hash_object.hexdigest()] + fields[3:]
writer.writerow(newrow)