#python #json #python-3.x #csv
Вопрос:
Этот скрипт предназначен для преобразования CSV в JSON для пользователя с Auth0 и ранее работал до тех пор, пока я не перешел на новую машину — после нескольких обновлений python, установки модулей и попыток исправления я достиг конца своего мастерства в устранении ошибок.
import csv, json, bcrypt, sys
csvPath = sys.argv[1]
jsonPath = sys.argv[2]
data = []
f = open( csvPath, 'r' )
reader = csv.DictReader( f, fieldnames = ( "name","email","password" ))
next(reader)
for row in reader:
entry = {}
sub1 = {}
sub2 = {}
pwd = row['password']
password = pwd.encode('utf-8')
salt = bcrypt.gensalt(rounds=10)
sub2['value'] = bcrypt.hashpw(password, salt)
entry['name'] = row['name']
entry['email'] = row['email']
entry['email_verified'] = True
sub1['algorithm'] = 'bcrypt'
sub1['hash'] = sub2
entry['custom_password_hash'] = sub1
data.append(entry)
out = json.dumps( data )
print ("JSON parsed!")
f = open( jsonPath , 'w')
f.write(out)
print ("JSON saved")
Сначала я получил TypeError: Unicode-objects must be encoded before hashing
сообщение об ошибке, которое побудило меня добавить .encode
строку 16.
Это изменило ошибку на эту:
Traceback (most recent call last):
File "python-auth0.py", line 28, in <module>
out = json.dumps( data )
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable
Я попытался добавить атрибут декодирования в «данные» в строке 28, что привело к AttributeError: 'list' object has no attribute 'decode'
Так что я явно просто делаю дикие удары в темноте здесь — любая помощь, чтобы заставить это снова работать, была бы признательна!
Комментарии:
1. не связанные … вы никогда не закрываете свой файл … использовать
with open( jsonPath , 'w') as f: f.write(out)
2. Спасибо @PatrickArtner — я добавил это изменение, а также исправление.
Ответ №1:
Я думаю, что вы можете сделать, это декодировать хэш обратно в строку python
import json, bcrypt
pwd = "mypassword"
password = pwd.encode('utf-8')
salt = bcrypt.gensalt(rounds=10)
hashed_pwd = bcrypt.hashpw(password, salt)
decoded_hash = hashed_pwd.decode('utf-8')
# this will raise exception
print(json.dumps(hashed_pwd))
# this will not
print(json.dumps(decoded_hash))
в вашем случае попробуйте:
import csv, json, bcrypt, sys
csvPath = sys.argv[1]
jsonPath = sys.argv[2]
data = []
f = open( csvPath, 'r' )
reader = csv.DictReader( f, fieldnames = ( "name","email","password" ))
next(reader)
for row in reader:
entry = {}
sub1 = {}
sub2 = {}
pwd = row['password']
password = pwd.encode('utf-8')
salt = bcrypt.gensalt(rounds=10)
sub2['value'] = bcrypt.hashpw(password, salt).decode('utf-8') # <-- here
entry['name'] = row['name']
entry['email'] = row['email']
entry['email_verified'] = True
sub1['algorithm'] = 'bcrypt'
sub1['hash'] = sub2
entry['custom_password_hash'] = sub1
data.append(entry)
out = json.dumps( data )
print ("JSON parsed!")
f = open( jsonPath , 'w')
f.write(out)
print ("JSON saved")
Комментарии:
1. Спасибо, что сделали это!