2015-03-13 67 views
-1

我有工作代碼,需要一個csv文件的目錄和哈希每行的一列,然後聚合所有文件在一起。問題是輸出只顯示第一個散列值,而不是爲每一行重新運行散列。下面是代碼:python哈希不在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

爲什麼這個:'hash_object = hashlib.md5(B '(領域[2])')',這應該是某事像:'hash_object = hashlib.md5(場[2])',但轉換爲二進制格式,否則你只有常量字符串'字段[2]' – 2015-03-13 15:05:20

回答

3

您正在創建一個固定的字節串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)