簡體   English   中英

從文本文件讀取python列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM