从文本文件读取python列表

时间:2019-04-30 16:14:07

标签: python python-3.x

我可以写入文件,但是当我读取文件时,它似乎是一个字符串

我有一个列表列表,我希望能够访问列表中的元素。

示例:

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']"]

我不确定双引号逗号是从哪里来的,但一定是在文件写入中。

我希望能够访问各个列表中的元素。

5 个答案:

答案 0 :(得分:2)

修复文本存储/加载

在存储为文本时,通常应用新行写出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()然后将其删除了,但这是使每个项目保持为单独项目的简便方法。否则,您将需要添加分隔符并读入单行,然后执行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 。使用此方法,您可以轻松读取静态数据并轻松读取回去。


改为使用泡菜

正如其他人所指出的那样,这不是进行数据序列化的好方法,这就是您正在做的事情。 Python预装了pickle,可以SimpleJWT进行序列化和存储任何Python数据类型,然后将其读回。

您可以像这样使用它:

with open('1556640109_intercom_Users', 'rb') as f:
    x = pickle.load(f)

然后再次阅读:

  $headers = ['alg' => 'RSA-OAEP-256', 'enc' => 'A128CBC-HS256'];
  $access_token = {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
  // Creating JWE object with headers and claims
  $jwe = new \SimpleJWT\JWE($headers, $claims);
  $jwe_encrypted = $jwe->encrypt($foreing_server_public_key);

答案 1 :(得分:2)

如上所述,您需要添加换行符(\n)。当您使用Python3标记问题时,那么您应该能够使用所谓的f字符串。那就是:

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

如果您想了解有关f弦的更多信息,可以阅读this tutorial。还存在其他字符串格式化方法,请随时使用最适合您需求的方法。

编辑:现在我读到您需要访问列表的特定项目。只需使用文本写入文件和从文件读取文件就可以使它正常工作,但是我建议您检查已经开发的模块,用于数据序列化

答案 2 :(得分:0)

尝试使用正则表达式和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)]

答案 3 :(得分:-1)

如果您希望将列表作为返回类型,则应使用f.read()而不是f.readlines()
在这里您可以看到列表仅由一个字符串元素组成,
因此x[1]不存在

答案 4 :(得分:-1)

几件事。 一种是将写入文件的方式更改为

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

带有换行符。然后,当您阅读时,

f.readlines()

应作为列表返回,因为您的每个项目都将换行。

如果不想更改write的方式,则必须处理列表x,该列表包含一个字符串元素,该字符串元素表示列表的字符串。

import ast 
ast.literal_eval(x[0])

应该给您您期望的清单。 x[0]访问string元素,而ast.literal_eval通常将python数据结构的字符串表示形式转换为实际的数据结构。