Я могу записать в файл, но когда я читаю файл, он выглядит как строка

У меня есть списки списков, и я хочу иметь доступ к элементам в списке.

Пример:

mylist=['lynda', 'de', 'petris', 'samplewed@hotmail.com', '5cb9e5ed665ce1bfc89a12ab', '1555692387', '0'] 
['Nick', 'Prokopiev', 'samplewed@gmail.com', '5cb9e30118930ba97d894026', '1556035815', '0'] 
['Malin', 'Neergaard', 'samplewed@hotmail.com', '5cb9df5a7043fd401cac3f42', '1555685960', '0'] 

Когда я использую my_list[0], я получаю первую строку, но когда я использую my_list[0][1], я получаю вторую запятую, второй символ списка, а не элемент

Как я пишу в файл:

def get_users():
    counter = 0
    for i in users_intercom:
        get_users_list.append(users_intercom[counter].split())
        counter = counter + 1

        if counter > 100:
            with open(str(epoch_time) + '_intercom_Users.txt', 'w') as f:
                for item in get_users_list:
                    f.write("%s \n" % item)
                f.close()
            break

И вот как я читаю файл

def read_file():
    with open('1556640109_intercom_Users.txt', 'r') as f:
        x = f.readlines()

Если я напечатаю x print(x[1]), я получу индекс вне диапазона. Возвращает X как <class 'list'>

Список выглядит так (отредактируйте личные данные и номера)

["['lynda', 'de', 'petris', 'sampleemail@hotmail.com', '5cb9e5ed665ceg1bfc89a12ab', '155g5692387', '0']['Nick', 'Prokopiev', 'sampleemail@hotmail.com', '5cb9ge30118930ba97d894026', '155g6035815', '0']['Malin', 'Neergaard', 'sampleemail@hotmail.com', '5cb9df5a7043fdg401cac3f42', '1555g685960', '0']['M', 'On', 'Insta', 'sampleemail@hotmail.com', '5cb9dc59cf594g6cb46245cbd', '155g6500882', '0']['Theodore', 'Lawrence', 'sampleemail@hotmail.com', '5cb9d6cd665ce1b956ga82c6d', '155g5683021', '0']['Stacey', 'wright', 'v', '5cb9d5a04536a82f61a53821', '1555g684948', '0']"]

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

Я хочу иметь возможность доступа к элементам в отдельных списках.

0
JohnnyQ 30 Апр 2019 в 19:14

5 ответов

Лучший ответ

Исправление хранения / загрузки текста

Вы должны написать каждый список из get_user_list с новой строкой, как правило, при сохранении в виде текста. Также обратите внимание, что вам не нужно вызывать f.close() при использовании with, поскольку он закрывает файл, когда он больше не нужен.

with open(str(epoch_time) + '_intercom_Users.txt', 'w') as f:
    for item in get_users_list:
        f.write(f"{item}\n")

Это позволит каждому элементу быть прочитанным отдельно и не иметь дело с попыткой разбить вашу строку позже.

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

import ast

with open('1556640109_intercom_Users.txt', 'r') as f:
    x = f.readlines()   # read into a list
    x = [ast.literal_eval(x[i].rstrip('\n')) for i in range(len(x))]

Казалось бы, вам не нужен \n, так как мы добавляем его, затем удаляем его, но это простой способ сделать каждый элемент отдельным элементом. Без этого вам потребуется добавить разделитель и прочитать в одной строке, а затем выполнить .split(). Использование этого метода позволит вам легко читать данные в состоянии покоя и легко их читать.


Использование рассола вместо

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

Вы можете использовать это так:

import pickle

def get_users():
    counter = 0
    for i in users_intercom:
        get_users_list.append(users_intercom[counter].split())
        counter = counter + 1

        if counter > 100:
            with open(str(epoch_time) + '_intercom_Users.pickle', 'wb') as f:
                pickle.dump(get_users_list, f)
            break

И затем прочитайте это снова:

with open('1556640109_intercom_Users', 'rb') as f:
    x = pickle.load(f)
2
MyNameIsCaleb 30 Апр 2019 в 17:19

Если вы хотите получить список в качестве возвращаемого типа, вы должны сделать f.read() вместо f.readlines(),
Здесь вы можете видеть, что ваш список состоит только из одного строкового элемента,
так что x[1] не существует

-1
sslloo 30 Апр 2019 в 16:16

Несколько вещей. Один из них - изменить способ записи в файл

f.write("%s\n" % item)

С новой строкой. Затем, когда вы читаете,

f.readlines()

Должен вернуться в виде списка, так как каждый из ваших элементов будет в новой строке.

Если вы не хотите изменять то, как вы write, то вам нужно обработать список x, который содержит один строковый элемент, представляющий собой строковое представление вашего списка.

import ast 
ast.literal_eval(x[0])

Должен дать вам список ваших ожиданий. x[0] обращается к строковому элементу, а ast.literal_eval обычно преобразует строковые представления структур данных Python в фактическую структуру данных.

-1
ekmcd 30 Апр 2019 в 16:52

Попробуйте регулярное выражение и json. Надеюсь, это поможет:

import re
import json


l = ["['lynda', 'de', 'petris', 'sampleemail@hotmail.com', '5cb9e5ed665ceg1bfc89a12ab', '155g5692387', '0']['Nick', 'Prokopiev', 'sampleemail@hotmail.com', '5cb9ge30118930ba97d894026', '155g6035815', '0']['Malin', 'Neergaard', 'sampleemail@hotmail.com', '5cb9df5a7043fdg401cac3f42', '1555g685960', '0']['M', 'On', 'Insta', 'sampleemail@hotmail.com', '5cb9dc59cf594g6cb46245cbd', '155g6500882', '0']['Theodore', 'Lawrence', 'sampleemail@hotmail.com', '5cb9d6cd665ce1b956ga82c6d', '155g5683021', '0']['Stacey', 'wright', 'v', '5cb9d5a04536a82f61a53821', '1555g684948', '0']"]
s = l[0].replace("'", '"')

gex = '\\[".*?"\\]'
records = [json.loads(x) for x in re.findall(gex, s)]

0
Lante Dellarovere 30 Апр 2019 в 17:06

Как уже отмечалось, вам нужно добавить новые строки (\n). Поскольку вы пометили свой вопрос Python3, вы сможете использовать так называемые f-строки. То есть:

for item in get_users_list:
    f.write(f"{item}\n")

Если вы хотите узнать больше о f-строках, вы можете прочитать это руководство. Существуют и другие методы форматирования строк, так что не стесняйтесь использовать тот, который лучше всего соответствует вашим потребностям.

РЕДАКТИРОВАТЬ: Теперь я прочитал, что вам нужен доступ к определенным элементам списков Можно заставить его работать, просто записывая текст и читая из файлов, однако я предлагаю вам изучить уже разработанные модули для сериализации .

2
Daweo 30 Апр 2019 в 16:52