
Имеется задача: считать определённые данные в список, загрузить их в текстовый файл, а из него выгрузить список в том же формате.
В списке элемент представлен в формате: [‘/faculty/95/groups/24036’, ‘13531/1’]
Вот код:
for f in b.find_all('a', href=True): h = f.getText() g.append( [f['href'], h]) i= i+1 print ("Found the URL:", f['href']) with open("groups.txt", "w") as file: print(*g, file=file, sep="\n") file.close() array = list(open('groups.txt')) print(array[8])#1 print(array[8][1])#2 print(array)#3
Но есть проблема, выгруженный из файла список представляется в неправильном виде, как строка. То есть запись #1 выводит всю восьмую строку, #2 выводит только первый символ восьмой строки, а #3 выводит единой строкой весь файл.
Как сделать так, чтобы можно было выгрузить список в том же виде, в котором он загружался в текстовый файл? Чтобы можно было запись #2 получить именно первый элемент(‘13531/1’), а не первый символ.
С Питоном работаю мало, после Си прям очень непривычно, поэтому такие вопросы и возникают.
3Answers

Еще может заинтересовать:

Нужно отталкиваться от конструкции, которая у вас на 6 строке:
with open('groups.txt') as f: my_lines = list(f)

Считать список строк из файла можно следующими способами:
with open('groups.py') as f: print(list(f)) with open('groups.py') as f: print(f.readlines()) with open('groups.py') as f: lines = [line for line in f] print(lines) with open('groups.py') as f: lines = [] for line in f: lines.append(line) print(lines)

У вас вложенный список, поэтому простая структура из списка строк для вас не подойдёт иначе код в вопросе уже правильно писал/читал бы список строк:
#!/usr/bin/env python3 from pathlib import Path urls = ['a', 'b', 'c'] path = Path('urls.txt') path.write_text('\n'.join(urls)) # write list urls = path.read_text().splitlines() # read list
Файл при этом выглядит как:
a b c
Для списка строк, состоящих из полей, можно csv формат использовать:
#!/usr/bin/env python3 import csv rows = [['a', 'A'], ['b', 'B'], ['c', 'C']] with open('urls.csv', 'w', newline='') as file: csv.writer(file).writerows(rows) # write rows with open('urls.csv', newline='') as file: rows = list(csv.reader(file)) # read rows
csv файл выглядит как:
a,A b,B c,C
Для более сложной структуры, представляющей каждый url, можно json формат использовать:
#!/usr/bin/env python3 import json from pathlib import Path pages = [ {'url': 'a', 'id': 1, 'next': [2, 3]}, {'url': 'b', 'id': 2, 'next': [1, 3]}, {'url': 'c', 'id': 3, 'next': [1, 2]} ] path = Path('pages.json') path.write_text(json.dumps(pages, indent=2), encoding='utf-8') # write pages = json.loads(path.read_text(encoding='utf-8')) # read
json файл:
[ { "url": "a", "id": 1, "next": [ 2, 3 ] }, { "url": "b", "id": 2, "next": [ 1, 3 ] }, { "url": "c", "id": 3, "next": [ 1, 2 ] } ]
Иногда можно каждый элемент на своей строчке писать http://jsonlines.org:
#!/usr/bin/env python3 import json # append page page = {'url': 'a', 'id': 1, 'next': [2, 3]} with open('pages.jsonlines', 'a', encoding='utf-8') as file: print(json.dumps(page), file=file) # process pages with open('pages.jsonlines', encoding='utf-8') as file: for line in file: page = json.loads(line) ...
файл может выглядеть как:
{"url": "a", "id": 1, "next": [2, 3]} {"url": "b", "id": 2, "next": [1, 3]} {"url": "c", "id": 3, "next": [1, 2]}
Если возникнет желание удалять из середины такого файла, не переписывая его целиком, или искать определённые записи по критериями, не просматривая весь файл, то стоит использовать встроенную базу данных, такую как sqlite (двоичный формат). В виде sql это выглядит как:
CREATE TABLE page ( id INTEGER NOT NULL, url VARCHAR(50), PRIMARY KEY (id) ); INSERT INTO "page" VALUES(1,'a'); INSERT INTO "page" VALUES(2,'b'); INSERT INTO "page" VALUES(3,'c'); CREATE TABLE association ( from_id INTEGER, to_id INTEGER, FOREIGN KEY(from_id) REFERENCES page (id), FOREIGN KEY(to_id) REFERENCES page (id) ); INSERT INTO "association" VALUES(1,3); INSERT INTO "association" VALUES(2,3); INSERT INTO "association" VALUES(1,2); INSERT INTO "association" VALUES(3,2); INSERT INTO "association" VALUES(2,1); INSERT INTO "association" VALUES(3,1);
Фактически, при использовании ORM такой как sqlalchemy для частых задач нет необходимости sql руками писать. К примеру, заполнение аналогичное приведённому sql может выглядеть как:
pages = Page(id=1, url='a'), Page(id=2, url='b'), Page(id=3, url='c') pages[0].next_pages.extend(pages[1:]) # similar for pages[1], pages[2]... session.add_all(pages)
Пример поиска. Найти страницу с заданным url:
page = session.query(Page).filter_by(url='a').one() print(page) # -> <Page(id=1, url='a', next_pages=[2, 3])>
Найти страницы, ссылающиеся на данную page
:
print(*session.query(Page).filter(Page.next_pages.contains(page)), sep='\n') # -> <Page(id=3, url='c', next_pages=[1, 2])> # -> <Page(id=2, url='b', next_pages=[1, 3])>