Построение списка диктов из CSV с использованием Python - PullRequest
0 голосов
/ 03 октября 2019

У меня есть CSV-файл, содержащий три столбца и много строк. Все данные являются строками. Я пытаюсь прочитать CSV по одной строке за раз и преобразовать каждую строку в Dict, который затем я хочу добавить в список, чтобы у меня был список Dicts. Средой является AWS Lambda, а CSV поступает из корзины S3.

Мой код:

csv_object = s3.Object('MyBucket', 'My.csv')
csv_file = csv_object.get()['Body'].read().decode('utf-8')

f = StringIO(csv_file)
reader = csv.reader(f, delimiter=',')

list_of_json = []
mydevice = {}

for row in reader:
    mydevice["device"] = row[0]
    mydevice["serial"] = row[1]
    mydevice["software"] = row[2]

    list_of_json.append(mydevice)

Программное обеспечение работает (то есть не содержит ошибок) ,но это не дает желаемого результата. Если я print(list_of_json) после завершения цикла for, я хочу, чтобы он произвел это;

[{"device":"Dev1", "serial":"Ser1", "software":"software1"},{.....}]

Но то, что на самом деле производит, это просто пустой список ... как будто оператор добавления даже не существует;

[]

Кажется, что чтение CSV и части for row in reader: работают нормально. Если я выполняю print (mydevice) внутри цикла for, я вижу, что он успешно проходит через все устройства, но по причинам, которые я не могу понять, оператор добавления никогда не добавляет ничего в список list_of_json.

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Почему бы просто не использовать csv.DictReader

csv_object = s3.Object('MyBucket', 'My.csv')
csv_file = csv_object.get()['Body'].read().decode('utf-8')

f = StringIO(csv_file)
reader = csv.DictReader(f, ('device', 'serial', 'software'))
list_of_json = [dict(device) for device in reader]
#also don't forget to
f.close() #or use contextlib.closing
1 голос
/ 03 октября 2019

Вам необходимо создать новый словарь внутри цикла:

csv_object = s3.Object('MyBucket', 'My.csv')
csv_file = csv_object.get()['Body'].read().decode('utf-8')

f = StringIO(csv_file)
reader = csv.reader(f, delimiter=',')

list_of_json = []

for row in reader:
    mydevice = {}
    mydevice["device"] = row[0]
    mydevice["serial"] = row[1]
    mydevice["software"] = row[2]
    list_of_json.append(mydevice)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...