[英]Reading a python list from a text file
我可以寫入文件,但是當我讀取文件時,它似乎是一個字符串
我有一個列表列表,我希望能夠訪問列表中的元素。
例:
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']"]
我不確定雙反逗號是從哪里來的,但一定是在文件寫入中。
我希望能夠訪問各個列表中的元素。
修復文本存儲/加載
在存儲為文本時,通常應使用新行寫出get_user_list
每個列表。 還要注意,使用with
時不需要調用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
因為我們先添加了\\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)
如前所述,您需要添加換行符( \\n
)。 當您使用Python3標記問題時,那么您應該能夠使用所謂的f字符串。 那是:
for item in get_users_list:
f.write(f"{item}\n")
如果您想了解有關f字符串的更多信息,可以閱讀本教程 。 還存在其他字符串格式化方法,因此請隨意使用最適合您需求的方法。
編輯:現在我讀到您需要訪問列表的特定項目。 僅通過寫入文件和從文件讀取文本就可以使它工作,但是我建議您檢查已經開發的模塊以進行數據序列化 。
嘗試regex和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)]
如果您希望將列表作為返回類型,則應執行f.read()
而不是f.readlines()
,
在這里您可以看到列表僅由一個字符串元素組成,
所以x[1]
不存在
一些東西。 一種是將寫入文件的方式更改為
f.write("%s\n" % item)
用換行符。 然后,當您閱讀時,
f.readlines()
應該會以清單形式返回,因為您的每個商品都將換行。
如果不想更改write
,則必須處理列表x
,其中包含一個字符串元素,這是列表的字符串表示形式。
import ast
ast.literal_eval(x[0])
應該給您您期望的名單。 x[0]
訪問字符串元素,而ast.literal_eval
通常將python數據結構的字符串表示形式轉換為實際的數據結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.