我可以写入文件,但是当我读取文件时,它似乎是一个字符串
我有一个列表列表,我希望能够访问列表中的元素。
示例:
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 :(得分: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数据结构的字符串表示形式转换为实际的数据结构。