Как прочитать список из текстового файла?

365 просмотра
0
0 Комментариев

Имеется задача: считать определённые данные в список, загрузить их в текстовый файл, а из него выгрузить список в том же формате.
В списке элемент представлен в формате: [‘/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’), а не первый символ.

С Питоном работаю мало, после Си прям очень непривычно, поэтому такие вопросы и возникают.


Добавить комментарий

3 Answers

Python Опубликовано 12.12.2018
0

Нужно отталкиваться от конструкции, которая у вас на 6 строке:

with open('groups.txt') as f:
    my_lines = list(f)

Добавить комментарий
0

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

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)

Добавить комментарий
0

У вас вложенный список, поэтому простая структура из списка строк для вас не подойдёт иначе код в вопросе уже правильно писал/читал бы список строк:

#!/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])>

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up