читать данные из файла в словари

Вы должны сделать это так, как вы описали. MongoDB является нереляционной базой данных и не поддерживает объединения.

1
задан gevor 17 January 2019 в 14:25
поделиться

4 ответа

Проверьте это ... не используя пакет.

with open("test.txt") as f:
  lines = [ line.strip().split(",") for line in f ]
  lines = [{ 
        "string": line[0], 
        "integer1": int(line[1]), 
        "integer2": int(line[2]), 
        "list1": [l for l in line[3].strip("()").split("/")],
        "list2": [l for l in line[4].strip("()").split("/")],
  } for line in lines ]
  print(lines)
0
ответ дан Sunil Goyal 17 January 2019 в 14:25
поделиться

Вы можете использовать csv.DictReader для этой цели.

С данным файлом примера вы можете использовать его следующим образом:

from csv import DictReader

FIELD_NAMES = ["string", "integer1", "integer2", "list1", "list2"]

with open("file_name.csv") as f:
    reader = DictReader(f, fieldnames=FIELD_NAMES)
    for line in reader:
        # line["integer1"] = int(line["integer1"])
        # ...
        print(line)
# OrderedDict([('string', 'name1'), ('integer1', '5'), ('integer2', '6'), ('list1', '(a1/a2/a3)'), ('list2', ' ()')])
# OrderedDict([('string', 'name2'), ('integer1', '7'), ('integer2', '8'), ('list1', '(a2/a3/a4/a5)'), ('list2', ' ()')])

Как вы можете видеть, это оценивает каждое поле как строку, так что вам придется добавить синтаксический анализ к целым числам и спискам к этому, но с этого следует начать.

Он также возвращает OrderedDict с, чтобы обеспечить порядок полей. При необходимости вы можете привести их к обычному диктату с помощью dict().

Чтобы получить список диктов, просто сделайте:

with open("file_name.csv") as f:
    reader = DictReader(f, fieldnames=FIELD_NAMES)
    print(list(reader))
# [OrderedDict([('string', 'name1'), ('integer1', '5'), ('integer2', '6'), ('list1', '(a1/a2/a3)'), ('list2', ' ()')]), OrderedDict([('string', 'name2'), ('integer1', '7'), ('integer2', '8'), ('list1', '(a2/a3/a4/a5)'), ('list2', ' ()')])]

Немного не связаны:

  • Не скрывайте встроенный list, вызывая ваши списки list
  • return не нуждаются в аргументе в скобках, пробела после return достаточно.
  • Прочтите официальное руководство по стилю Python, PEP8 .
0
ответ дан Graipher 17 January 2019 в 14:25
поделиться

inside file1.txt

hey1,5,6, (a1 / a2 / a3), ()
hey2,7,8, (a2 / a3 / a4 / a5) , ()

Вы можете использовать приведенный ниже код, он будет генерировать новый словарь для каждой строки и, наконец, весь словарь внутри dict_main.

index1=['string1','integer1','integer2','list1','list2']
dict_main={}
with open ('file1.txt') as f:
    count=0
    for line in f:
        dict1={}
        lst1=line.strip().split(',')
        dict1[index1[0]]=lst1[0]
        dict1[index1[1]]=int(lst1[1])
        dict1[index1[2]]=int(lst1[2])
        dict1[index1[3]]=lst1[3][1:-1].strip().split('/')
        dict1[index1[4]]=[]
        count+=1
        dict_main['dict'+str(count)]=dict1
print(dict_main)

Результат

{'dict1': {'integer2': 6, 'list2': [], 'integer1': 5, 'list1': ['a1', 'a2', 'a3'], 'string1': 'hey1'}, 'dict2': {'integer2': 8, 'list2': [], 'integer1': 7, 'list1': ['a2', 'a3', 'a4', 'a5'], 'string1': 'hey2'}}
0
ответ дан Sachin Sah 17 January 2019 в 14:25
поделиться

Вы также можете использовать регулярные выражения и избегать использования символа «/», если хотите, например:

import re    
txt1 = "name1,5,6,[a1,a2,a3],[]"
regex = "([a-zA-Z0-9]*),([0-9]+),([0-9]+),\[(.*)\],\[(.*)\]"
matches = re.match(regex, txt1)
dict1 = {"string": matches.group(1), "integer1": matches.group(2), "integer2": matches.group(3),
         "list1": matches.group(4).split(","), "list2": matches.group(5).split(",")}

Результат:

{'string': 'name1', 'integer1': '5', 'integer2': '6', 'list1': ['a1', 'a2', 'a3'], 'list2': ['']}
0
ответ дан T.Lucas 17 January 2019 в 14:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: